Singleton Pattern
오직 한 개의 클래스 인스턴스만을 갖도록 보장하고 이에 대한 전역적인 접근을 허용하는 패턴이다.
활용성
- 클래스의 인스턴스가 오직 하나여야 함을 보장하고, 잘 정의된 접근점으로 모든 사용자가 접근할 수 있도록 해야할 때
- 유일한 인스턴스가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정 없이 확장된 서브클래스의 인스턴스를 사용할 수 있어야 할 때
싱글톤 패턴 사용에 따른 결과
유일하게 존재하는 인스턴스로의 접근 통제
싱글톤 클래스는 인스턴스를 캡슐화하기 때문에 이 클래스에서 사용자가 언제, 어떻게 이 인스턴스에 접근할 수 있는지에 대한 제어가 가능하다.
namespace 제어
싱글톤 패턴은 전역변수보다 네임스페이스 관점에서 우수하다.
연산 및 표현의 정제
싱글톤 클래스는 상속이 가능하기 때문에 상속한 서브클래스를 통해 새로운 인스턴스를 만들 수 있다. 이를 통해 런타임에 필요한 클래스의 인스턴스를 사용한 프로그램의 구성이 가능하다.
인스턴스 개수 변경의 자유로움
상황이 바뀌어 싱글톤 클래스의 인스턴스 개수를 하나가 아닌 여러개로 변경하고 싶을 때 변경이 용이하다.
싱글톤
구조
싱글톤의 구조는 다음과 같다.
C++ 구현
1 2 3 4 5 6 7 8 9 10 11 12
| void SingletonPattern::SingletonPattern() { getSingletonPattern(); }
void SingletonPattern::getSingletonPattern() { Singleton* callFirst = Singleton::getInstance(); Singleton* callSecond = Singleton::getInstance(); std::cout<<"MEMORY OF FIRST : "<<(void*)&callFirst<<std::endl; std::cout<<"MEMORY OF SECOND : "<<(void*)&callSecond<<std::endl; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Singleton { static Singleton* instance; protected: Singleton() { std::cout<<"Singleton Instance Constructed"<<std::endl; } public: static Singleton* getInstance(); };
Singleton* Singleton::instance = new Singleton();
Singleton* Singleton::getInstance() { return instance; }
|
1 2 3
| Singleton Instance Constructed MEMORY OF FIRST : 0x7ffee8402818 MEMORY OF SECOND : 0x7ffee8402810
|
java 구현
1 2 3 4 5
| public class Client { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); } }
|
1 2 3 4 5 6 7 8
| public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {}
public static Singleton getInstance() { return instance; } }
|