728x90

1. 싱글턴 패턴 정의

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

 

2. 싱글턴 구현

class FileSystem
{
public:
    static FileSystem& GetInstance()
    {
        static FileSystem* instance = new FileSystem();
        return *instance;
    }

private:
    // 외부에서 생성자 호출을 허용하지 않기 위해
    FileSystem() {}
};
  • 오직 한 개의 클래스 인스턴스만 갖도록 보장한다.
  • 전역 접근점 제공
  • 사용할 때 초기화되므로, 사용하지 않는다면 인스턴스를 생성하지 않는다. ( 런타임 초기화 )

 

3. 싱글턴  상속을 이용한 예시

class FileSystem
{
public:
    static FileSystem& GetInstance();

    virtual ~FileSystem();
    virtual char* ReadFile( char* InPath ) = 0;
    virtual void WriteFile( char* InPath, char* InContents ) = 0;

protected:
    FileSystem() {}
};

// Android FileSystem
class AndroidFileSystem : public FileSystem
{
    virtual char* ReadFile( char* InPath ) override;

    virtual void WriteFile( char* InPath, char* InContents) override;
};

// iOS FileSystem
class iOSFileSystem : public FileSystem
{
    virtual char* ReadFile( char* InPath ) override;

    virtual void WriteFile( char* InPath, char* InContents) override;
};

FileSystem& FileSystem::GetInstance()
{
#if PLATFORM == PLATFORM_ANDROID
    static FileSystem* instance = new AndroidFileSystem();
#elif PLATFORM == PLATFORM_iOS
    static FileSystem* instance = new iOSFileSystem();
#endif
    return *instance;
}
  • #if 전처리기 지시문을 이용해 컴파일러가 시스템에 맞는 파일 시스템 객체를 만들게 할 수 있다.

 

4. 싱글턴 문제점

  • 전역 변수가 접근하는 곳을 모두 확인해야 하므로, 코드를 이해하기 어렵게 한다.
  • 인스턴스에 대한 접근 통제가 없으므로, 커플링을 조장한다.
  • 다른 스레드가 전역 변수에 어떤 작업을 하는지 모를 때가 있어 데드락이 생기기 쉽다.
반응형

+ Recent posts