Goal
- 싱글턴(Singleton) 패턴을 이해한다.
싱글턴(Singleton) 패턴
싱글턴(Singleton) 패턴은 인스턴스가 오직 하나만 생성되는 것을 보장하고 어디에서는 인스턴스에 접근할 수 있도록 하는 디자인 패턴
※싱글턴은 하나의 원소만을 가지는 집합을 의미
- Singleton : 하나의 인스턴스만을 생성하는 책임이 있으며 getInstance() 메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행
- 싱글톤 클래스는 생성자를 Private으로 함으로써 외부에서 객체를 생성할 수 없도록 하고 instance를 전역(Static)으로 구현한다.
- 외부에서는 GetInstance() 함수를 사용하여 접근할 수 있도록 한다.
▷싱글턴 패턴 장점
- 고정된 메모리영역을 얻으면서 한 번의 new()로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
- 싱글톤으로 만들어진 클래스는 전역 인스턴스로 설계되었기 때문에 다른 클래스에서 접근이 용이함
▷싱글턴 패턴 단점
- 싱글톤을 너무 많이 사용하거나 너무 많은 것을 수행하게 되면 다른 클래스와 결합도가 높아진다. -> OCP를 위배함
- 멀티스레드 환경에서 동기화 처리 작업을 해주지 않으면 여러 개의 인스턴스가 생성되는 현상이 발생할 수 있다 -> 싱글턴은 하나의 인스턴스만 보장
싱글턴(Singleton) 구현
- Singleton 클래스를 생성할 때 instance 전역변수는 private로 선언한다.
- paylock 오브젝트와 lock()을 사용한 이유는 멀티 스레드 환경에서 하나의 인스턴스만 생기는 게 아니라 두 개 이상의 인스턴스가 생기지 않도록 하기 위해서 사용한다.
- lock()을 사용함으로써 쓰레드가 순서대로 동기화되도록 한다.
- instance가 없을 경우에만 인스턴스를 생성
- Linq 구문을 사용하여 class 와 new()만 사용할 수 있도록 설계
- 위의 Singleton 클래스에서는 GetInstance()에 대해서 표기를 했지만 실제 코드에서는 GetInstance 함수 대신에 Instance라는 프로퍼티를 만들어서 사용하였다.
다중 쓰레드에서 문제가 될 수 있는 부분을 해결함과 동시에 인스턴스가 오직 하나만 생성되는 것을 보장하도록 구현
싱클턴 디자인패턴을 사용하여 프린터 사용하는 프로그램을 구현해보자.
Singleton 클래스를 상속받는 LGPrinter와 SamsumPrinter를 구현하고 Printer가 할 수 있는 행위(Print)를 캡슐화하는 인터페이스(Printable)를 구현하였다. 또한 사용자(Client)가 PrinterRoom을 통해서 원하는 프린트 기계를 사용하여 Print를 할 수 있도록 설계하였다. 사실 PrinterRoom에서는 Printerable를 활용하면 LGPrinter와 SamsungPrinter를 모두 접근하여 Print할 수 있기 때문에 Singleton을 굳이 사용할 필요는 없지만 간단하게 어떻게 사용되는지 보기 위해서 싱글턴 패턴 또한 사용하였다.
PrinterRoom 클래스에서 UseSamsumPrint를 보면 SamsumPrinter.Instance에 접근해서 Print 함수를 호출하도록 하였다.
싱글톤을 만들 때 Instance를 사용해도 되고 I, O와 같이 줄여서 사용하여도 된다. 그리고 싱글톤은 Manager급 클래스에서 많이 사용된다.
'Programming > DesignPattern' 카테고리의 다른 글
[디자인 패턴] 데코레이터(Decorator) 패턴 (1) | 2021.05.23 |
---|---|
[디자인 패턴] 커맨드(Command) 패턴 (0) | 2021.05.20 |
[디자인 패턴] 스테이트(State) 패턴 (0) | 2021.05.17 |
[디자인 패턴] 옵저버(Observer) 패턴 (0) | 2021.04.30 |
[디자인 패턴] 전략(Strategy) 패턴 (0) | 2021.04.26 |
댓글