CS/DesignPattern

[DesignPattern] 싱글톤 패턴

리네엔 2024. 10. 14. 22:51
  • 득보다는 실이 많다!
  • 전역 변수와 유사하게 작동한다! << 패악의 원인

Singleton Pattern 이란?

  • 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장
  • 해당 인스턴스에 전역적으로 접근 할 수 있도록 함

State Pattern의 구조

  • 외부에서 생성하지 못하도록 생성자를 private로 막음
  • Instance 프로퍼티를 사용해 get할때 없다면 생성될 수 있도록 함
public class Singleton{
    private static Singleton instance = null;

    private Singleton(){}

    public static Singleton Instance{
        get{
            if(instance ==null)
                instance = new Singleton();
            return instance;
        }
    }
}

아니 안 좋으면 왜 사용하는데?

  • 한번도 사용하지 않으면 아예 인스턴스를 생성하지 않는다
  • 정적 멤버 변수와는 다르게 런타임에 초기화 된다
  • 싱글톤을 상속할 수 있다!
    pubilc class FileSystem
    {
      public static FileSystem Instance;
      public void Init()
      {
      # if PLATFORM==PLAYSTATION5
           Instance = new PS5FileSystem()
      #elif PLATFORM==NINTENDO
          Instance = new NIntendoFileSystem();
      #endif
      }
      public virtual string ReadFile(string str){}
      pubilc virtual string WriteFile(string path, string contents){}
    }
    public class PS5FileSystem : FileSystem
    {
      // 소니의 파일 IO API를 사용
    }
    pubilc class NintendoFileSystem : FileSystem
    {
      // 닌텐도의 파일 IO API를 사용
    }

    간단하게 시스템에 맞는 파일 시스템 객체를 만들 수 있다!

근데 전역변수야..

  • 전역변수는 코드를 이해하기 어렵게 한다.
  • 전역 변수는 커플링을 조장한다.
  • 전역 변수는 멀티스래딩과 같은 동시성 프로그래밍에 알맞지 않다.

    다른 문제도 있어...

  • 싱글턴은 두가지 문제를 풀고자 한다!
    • 전역 접근과 한개의 인스턴스.. 우린 대부분 전역접근만 원하잖아?
  • 게으른 초기화는 제어가 불가능하다!
    • 언제 초기화가 일어날지 모른다. 혹여나 엄청나게 큰 데이터를 로드하는 초기화가 게임하는 중간에 일어나면 프레임 드랍이 일어날 것!

근데 그래서 싱글톤이 풀고자 하는 각각의 문제를 하나씩 해결하는 방법은?

  1. 한개의 클래스 인스턴스만 갖도록 보장하기

    public class FileSystem
    {
     public FileSystem()
     {
         assert(!instance);
         instance = true;
     }
     private static bool instance = false;
    }

    싱글턴은 컴파일 시간에 단일 인스턴스를 보장하는데, 이 방식에서는 런타임에 인스턴스 개수를 확인한다는 문제가 있긴하다고 함.

  2. 인스턴스에 쉽게 접근하기

  • 넘겨주기
  • 상위 클래스로부터 얻기
  • 이미 전역인 객체로부터 얻기

다른 대체 패턴
서비스 중개자 패턴
하위클래스 샌드박스 패턴

'CS > DesignPattern' 카테고리의 다른 글

[DesignPattern] 경량 패턴  (0) 2024.10.14
[DesignPattern] 커맨드 패턴  (0) 2024.10.14
[DesignPattern] 옵저버 패턴  (0) 2024.10.14
[DesignPattern] 전략 패턴  (0) 2024.10.14
[Design Pattern]상태 패턴  (0) 2024.10.14