[생성 패턴] Singleton(단일체)-미완

songtofu·2024년 3월 5일
0

GoF_디자인_패턴

목록 보기
1/1

의도

오직 한 개의 클래스 인스턴스만 갖도록 보장, 이에 대한 전역적인 접근점을 제공

왜?

정확히 하나의 인스턴스만을 갖도록 하는 것이 좋은 클래스가 있다. ex) 파일 시스템, 윈도우 관리자, ...

어떻게?

클래스 자신이 자기의 유일한 인스턴스로 접근하는 방법을 자체적으로 관리하게 한다. 이 클래스는 또 다른 인스턴스가 생성되지 않도록 할 수 있고, 클래스 자신이 그 인스턴스에 대한 접근 방법을 제공.

언제 쓰나?

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

장점?

  1. 유일하게 존재하는 인스턴스로의 접근을 통제
  2. name space를 좁힌다.
  3. 연산 및 표현의 정제를 허용한다.
  4. 인스턴스의 개수를 변경하기가 자유롭다.
  5. 클래스 연산을 사용하는 것 보다 훨씬 유연한 방법이다.

구현시 유의 사항.

  1. 인스턴스가 유일해야 함을 보장한다.
  2. Singleton의 클래스를 서브클래싱한다.

예시 코드

1. Basic Singleton

class Singleton
{
private:
	Singleton(){};    
	Singleton(const Singleton& other);
    static 	Singleton instance;

public:    
    static Singleton* GetInstance()    
    {        
    	return instance;    
    }
}; 

Singleton* Singleton::instance = nullptr;

//사용법
Singleton::GetInstance()

단점

  1. static 클래스 멤버 변수는 static 전역 변수처럼 프로그램 시작 시 main함수 호출 이전에 초기화 되므로 프로그램이 어떻게 되든 메모리를 잡게된다.
  2. 정적 개체이기 때문에, 다른 전역 객체의 생성자에서 참조하고 싶은 경우 문제 발생. C++ 표준에서는 전역 객체들의 생성 순서에 명확히 정의되어있지 않기 때문.

즉, 어떠한 전역 객체의 생성자에서 위 싱글톤을 참조하려할 때, 싱글톤 객체가 생성되기 이전에 발생할 수 있다. 때문에 객체의 생성 시점을 변경해야함.

2. Dynamic Singleton

위에 나온 문제점을 피해가도록 프로그래밍.
Effective C++에서 나온 늦은 초기화를 사용한 싱글톤을 만든다.

class DynamicSingleton
{
private:
	DynamicSingleton() {};    
	DynamicSingleton(const DynamicSingleton& other);    
	~DynamicSingleton() {};     
	static DynamicSingleton* instance; 
public:    
	static DynamicSingleton* GetInstance()    
    {        
     	if(instance == NULL) instance = new DynamicSingleton();        
        return instance;    
    }
};

DynamicSingleton* DynamicSingleton::instance = nullptr; 

//사용법
DynamicSingleton::GetInstance()

출처: https://vallista.tistory.com/entry/1-Singleton-Pattern-in-C, GoF 디자인 패턴 책

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글