마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

state pattern 사용 시 singleton 도 같이 필요한가요?

0 추천

state 패턴을 처음 들어봤는데, 찾아보니 감은 오는데 맞는 건지 몰라서 질문합니다.

  • 앱은 A, B, C 라는 기기 중 하나와 연결 됩니다.
  • 현재 연결된 기기 종류를 앱 전체 이곳저곳에서 사용합니다.
  • 현재 연결된 기기 종류에 따라 특정 뷰를 표시할지말지 결정합니다.
  • 기기 종류를 바꾸는 화면이 따로 있습니다.
  • DB는 사용하지 않습니다.
 
public interface BaseDevice {
  boolean showBottomLayout();
}
public class DeviceA implements BaseDevice {
  @Override public boolean showBottomLayout() { return true; }
}
public class DeviceB implements BaseDevice {
  @Override public boolean showBottomLayout() { return false; }
}
public class DeviceC implements BaseDevice {
  @Override public boolean showBottomLayout() { return true; }
}

근데 어느 화면에서나 현재 연결된 기기를 알기위해서는 어디선가 한 번은 singleton을 써야하는게 맞나요?

쎄미 (162,410 포인트) 님이 2017년 1월 5일 질문
http://micropilot.tistory.com/entry/Strategy-State-pattern-example 보니 그마저도 제가 패턴을 잘못 이해했네요 ㅠㅠ
그래도 어디선가는 singleton 을 써야하지 않나요?
안녕하세요.
예전에 모바일 게임 프로젝트에서 사용한 구조가 있어서 한번 써 봅니다.
저도 패턴을 공부하면서 느끼는게 개별로 보면 어려운데 같이 사용하면서 예를 보면 좀 이해가 쉬워집니다.

Strategy와 State는 비슷하지만 확연히 다른게 상태를 유지하는가, 동일한 동작의 기능이 다르게 동작하는가가 큰 차이라고 생각합니다.

그래서 State 패턴과 Strategy 패턴의 형태를 동시에 사용하는(예전 모바일 게임에서 많이 사용했던 형태) 경우가 종종 있었구요.. 여기에서 게임의 상태를 체크하는(무한 루프) 객체는 Singleton을 사용해서 게임의 상태를 체크하게 됩니다.

그래서 대충 다시 설명을 하자면.. Mediator 형태의 Singleton 객체가 게임상에 있는 여러 객체를 유지하고 있다가, 이 객체는 State와 Strategy의 형태를 가지게 됩니다. 그래서 게임상에서 특정 객체에 어떤 액션이 일어나면 State가 변경이 되고, 그에 따라서 Strategy의 액션이 변경되는 구조로 구현을 했습니다.  

얼키 도움이 되었나 모르겠네요.. ^^
만약 상태 유지와 동일한 동작의 기능이 다른 걸 동시에 하면서 여러 화면에서 현재 상태를 가져와야 한다면, singleton이 필요하게 되는게 맞나요?
이건 꼭 singleton이 필요한건 아닐것 같네요.. 개인적으로 위에 말씀하신 요구사항이면 액티비티에서 서비스 구동시키고, 서비스에서 연결된 디바이스에 해당하는 UI는 액티비티에서 Fragment로 처리하면 될 것 같네요.
어쨌거나 현재 상태를 들고 있는 누군가는 있어야 하는 건 맞는 거군요. 이미 복잡한 ui라 fragment로 변경은 위험하니 singleton을 써야겠어요. 고맙습니다.

1개의 답변

0 추천
 
채택된 답변
http://hongjinhyeon.tistory.com/50

state 패턴 관련해서 잘 설명이 되어 있길래 링크 걸어 봅니다.

경우에 따라 다르기는 하겠지만 state 패턴만을 생각 하였을때에는 singleton과는 무관한거 같습니다.

내부 상태에 따라 자기자신이 어느 인스턴스가 되는지 결정만 지어주면 되는거 아닐까요??
Development Guy (70,570 포인트) 님이 2017년 1월 9일 답변
쎄미님이 2017년 1월 10일 채택됨
근데 화면이 바뀌면 기존 화면에서 사용한 상태를 못 가져오지 않나요? 예제들도 같은 화면에서 상태 바꾸는 것만 나와있어서요...
질문자님이 생각하시는 개념이랑 위 링크에서 설명하는 개념이랑 좀 다른거 같네요. 제가 만약 질문자님이라면  singleton 인스턴스를 추가하는것 보다는  이미 생명주기에 포함 되어 있는 Application 객체를 사용해서 특정 화면의 상태를 저장하여 사용할것 같습니다. 화면단위인 Activity 컴포넌트보다 상위 개념이고 일반적으로 전역으로 접근이 필요한 경우에 Application 객체를 사용합니다.
그 방법도 있겠군요. 어쨌거나 누군가는 현재 상태를 들고 있어야 한다는 것만으로 만족합니다 ㅎㅎ 고맙습니다.
...