싱글톤은 전역 네임스페이스에 종속 되지 않기 때문에 종종 전역 변수보다 선호됩니다.
또한 지연 할당 및 초기화를 허용하는 반면 전역 변수는 항상 리소스를 소비합니다.
싱글톤 패턴은 추상 팩토리, 팩토리 메소드, 빌더 및 프로토타입 패턴과 같은 다른 디자인 패턴의 기반으로도 사용할 수 있습니다.
파사드 객체는 단 하나의 파사드 객체만 필요하기 때문에 싱글톤인 경우가 많습니다.
메시지를 기록하려는 모든 객체는 단일 액세스 지점이 필요하고 개념적으로 단일 소스에 쓰기 때문입니다.[4]
최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다.
뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.
다른 클래스 간에 데이터 공유가 쉽다
여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이점을 유의해서 설계하는 것이 좋다.
C++ Sample Source
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include<stdio.h> #include<assert.h> #include "vector" #define AfxGetApp() KSingleton<CWinApp>::GetSingleton() #define DEBUG template<typename T> class KSingleton { private: static T* ms_pSingleton; public: KSingleton() { assert(NULL == KSingleton<T>::ms_pSingleton); KSingleton<T>::ms_pSingleton = (T*)this; } ~KSingleton() { KSingleton<T>::ms_pSingleton =NULL; } static T* GetSingleton() { return ms_pSingleton; } }; /*static*/ template<typename T> T* KSingleton<T>::ms_pSingleton = NULL; class CWinApp : public KSingleton<CWinApp> { public: void Print() { printf("hello\n"); } }; CWinApp theApp; void main() { //KSingleton<CWinApp>::GetSingleton()->Print(); //위에서 메크로 적용 AfxGetApp()->Print(); #ifdef DEBUG //cmd char e; scanf("%c",&e); #endif } |