최상단 광고

2012년 4월 17일 화요일

[Chapter6] 생성 패턴 - 단일체

1. 단일체(Singleton) 패턴이란?
오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다. 클래스 자신이 자기의 유일한 인스턴스로 접근하는 방법입니다.
ex) 프린터 스풀, 윈도우 관리자 등.


2. 단일체 패턴은 언제 사용되는가?
- 클래스의 인스턴스가 오직 하나여야 함을 보장하고, 잘 정의된 접근점으로 모든 사용자가 접근할 수 있도록 해야 할 때
- 유일한 인스턴스가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정 업이 확장된 서브클래스의 인스턴스를 사용할 수 있어야 할 때


3. 단일체 패턴의 다이어그램


☆ Singleton
: Instance() 연산을 정의하여, 유일한 인스턴스로 접근할 수 있도록 합니다.
  Instance() 연산은 클래스 연산입니다. 유일한 인스턴스를 생성하는 책임을 맡습니다.

4. 단일체 패턴을 쓰면...
1) 유일하게 존재하는 인스턴스로의 접근을 통제합니다.
: Singleton 클래스 자체가 인스턴스를 캡슐화하기 때문에, 이 클래스에서 사용자가 언제, 어떻게 이 인스턴스에 접근 할 수 있는지 제어 할 수 있습니다.

2) 네임스페이스를 좁힙니다.
단일체 패턴은 전역 변수보다 더 좋습니다. 전역 변수를 사용해서 네임스페이스를 망치는 일을 없애주기 때문입니다. 즉, 전역 변수를 정의하여 발생하는 디버깅의 어려움 등 문제를 없앱니다.

3) 연산 및 표현의 정체를 허용합니다.
: Singleton 클래스는 상속될 수 있기 때문에, 이 상속된 서브클래스를 통해서 새로운 인스턴스를 만들 수 있습니다. 또한 이 패턴을 사용하면, 런타임에 필요한 클래스의 인스턴스를 써서 응요프로그램을 구성할 수도 있습니다.

4) 인스턴스의 개수를 변경하기가 자유롭습니다.
: 마음이 바뀌어서 Singleton 클래스의 인스턴스가 하나 이상 존재할 수 있도록 변경해야 할 때도 있는데, 이 작업도 어렵지 않습니다. 게다가, 응용프로그램이 사용하는 인스턴스가 다수여야 할 때도 똑같은 방법을 쓸 수 있습니다.
  즉, Singleton 클래스의 인스턴스에 접근할 수 있는 허용 범위를 결정하는 연산만 변경하면 됩니다. 왜냐하면 기존에는 하나의 인스턴스로만 접근을 허용했다면, 이제는 여러 개의 인스턴스를 생성해서 그 각각의 인스턴스로 접근할 수 있도록 연산의 구현을 바꾸면 되기 때문입니다.

5) 클래스 연산을 사용하는 것보다 훨씬 유연한 방법입니다.
: 단일체 패턴과 동일한 기능을 발휘하는 방법이 클래스 연산을 사용하는 것입니다. 그러나 이 두 언어(C++, 스몰토크)에서 클래스의 인스턴스가 하나 이상 존재할 수 있도록 설계를 변경하는 것은 어려습니다.


cf) 구현방법 中
: 단일체에 대한 레지스트리를 사용하는 것입니다. Instance() 연산에 가능한 Singleton 클래스 집합을 정의하는 대신에 Singleton 클래스는 이 단일체 인스턴스를 레지스트리에 이름을 갖는 인스턴스로 등록합니다.
  레지스트리는 문자열로 정의된 이름을 해당 단일체 인스턴스로 대응시켜 둡니다. Instance() 연산에서 단일체가 필요할 때 레지스트리를 뒤져서 이름으로 해당 단일체를 찾아달라고 의뢰하면 레지스트리는 해당하는 단일체를 찾아서 돌려주는 것입니다. 이런 방식을 취하면 Instance() 연산이 모든 달일체 클래스와 인스턴스를 알 필요가 업습니다.

댓글 없음: