디자인 패턴 - 싱글턴 패턴(Singleton pattern)

정의 - 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든 그 인스턴스에 접근할 수 있도록 하기 위한 패턴.

 객체를 하나만 만들어서 유일하게 관리하는 디자인 패턴. 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
기초적인 구현은 생성자를 private으로 만들고, 정적 메소드에서 인스턴스를 반환하는 것.
 멀티스레딩 관련 문제에는 주의할 것.

싱글턴을 상속할 수도 있다. 크로스플랫폼으로 무언가를 할 때, 플랫폼 종속적인 부분은 자식 클래스에 맡겨두고 부모 클래스에서는 전처리기 지시문 같은 걸로 플랫폼을 파악해서 싱글턴 객체를 만들면 된다.


전역 변수의 문제점

  • 컴퓨터 과학에서 전역 상태에 접근하거나 수정하지 않는 함수를 '순수(pure)' 함수라고 한다. 순수 함수는 이해하기 쉽고 컴파일러가 쉽게 최적화할 수 있다.


  • 커플링을 조장한다.


  • 멀티스레딩에 알맞지 않다. 싱글턴은 모든 스레드가 보고 수정할 수 있는 메모리 영역이 생기는 셈인데, 교착상태, 경쟁상태 등의 동기화 버그가 생길 수 있다.
싱글턴은 클래스로 캡슐화된 전역변수이므로, 위 문제점이 모두 발생한다.

또한, 한 개의 인스턴스/전역 접근. 이 두 가지 중 하나만 필요할 때에도 둘 다 사용하게 된다.

게으른 초기화 시점을 제어하기가 쉽지 않다. 메모리 할당을 제어할 수 있으려면 적절한 초기화 시점을 찾아야 한다.



대안

  • 전역 접근 없이 클래스 인스턴스만 한 개 만들게끔 보장한다. 
  • 이미 전역인 객체로부터 객체를 얻을 수 있다. Log, FileSystem, Audio, Player 등을 각각 싱글턴으로 만드는 대신 Game이라는 하나의 싱글턴 객체가 갖고있게 하자. (최소지식 원칙에는 위배된다)
  • 서비스 중개자를 사용할 수도 있다.


댓글

이 블로그의 인기 게시물

디자인 패턴 - 더티 플래그(Dirty flag)

디자인 패턴 - 서비스 중개자 패턴(Service locator pattern)

인공지능 - 유한 상태 기계(Finite state machine)