- 득보다는 실이 많다!
- 전역 변수와 유사하게 작동한다! << 패악의 원인
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를 사용 }
간단하게 시스템에 맞는 파일 시스템 객체를 만들 수 있다!
근데 전역변수야..
- 전역변수는 코드를 이해하기 어렵게 한다.
- 전역 변수는 커플링을 조장한다.
- 전역 변수는 멀티스래딩과 같은 동시성 프로그래밍에 알맞지 않다.
다른 문제도 있어...
- 싱글턴은 두가지 문제를 풀고자 한다!
- 전역 접근과 한개의 인스턴스.. 우린 대부분 전역접근만 원하잖아?
- 게으른 초기화는 제어가 불가능하다!
- 언제 초기화가 일어날지 모른다. 혹여나 엄청나게 큰 데이터를 로드하는 초기화가 게임하는 중간에 일어나면 프레임 드랍이 일어날 것!
근데 그래서 싱글톤이 풀고자 하는 각각의 문제를 하나씩 해결하는 방법은?
한개의 클래스 인스턴스만 갖도록 보장하기
public class FileSystem { public FileSystem() { assert(!instance); instance = true; } private static bool instance = false; }
싱글턴은 컴파일 시간에 단일 인스턴스를 보장하는데, 이 방식에서는 런타임에 인스턴스 개수를 확인한다는 문제가 있긴하다고 함.
인스턴스에 쉽게 접근하기
- 넘겨주기
- 상위 클래스로부터 얻기
- 이미 전역인 객체로부터 얻기
다른 대체 패턴
서비스 중개자 패턴
하위클래스 샌드박스 패턴
'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 |