Singleton Pattern (싱글톤 패턴)
- Ensures that only one instance of a class is allowed within a system.
- multi-threaded issue해결을 위해, 시스템 내에서 클래스의 인스턴스 하나만 허용
→ instance는 외부에서 바꿀 수 없게 private으로 선언
→public static으로 제공
uniqueInstace를 null check 후, 없을 때만 생성해서 return
→ '하나'의 인스턴스만 생성하여, 한 번만 메모리에 올리고 사용하는 디자인 패턴
→ 인스턴스가 필요할 때, 똑같은 인스턴스를 만들지 않고 기존의 인스턴스를 활용
→ 단점: 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아짐
=> OCP(개방-폐쇄 원칙)에 위배
→ 결합도가 높아지게 되면, 유지보수가 힘들고, 테스트도 원활하게 진행할 수 없음
→ 멀티 스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성되는 문제도 발생할 수 있음
=> 반드시 싱글톤이 필요한 상황이 아니면 지양하는 것이 좋다고 함
Multi-Thread issue
Sol1) synchronized the getInstance() method
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
→ Cause small impact on run-time performance due to frequent locking.
Sol2) Use eager instantiation
private static Singleton uniqueInstance = new Singleton();
→ always instantiate the class
Sol3) Double checked locking
public class Singleton {
private volatile static Singleton uniqueInstance = null;
// other useful instance variables
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized(Singleton.class) {
if (uniqueInstance == null)
uniqueInstance = new Singleton();
}
}
return uniqueInstance;
}
// other useful methods
}
→ A perfect solution with using volatile keyword / running at least Java 5
Related Patterns
- Abstract Factory, Builder, and Prototype can use Singleton in their implementation. (singleton을 사용)
- Facade objects are often Singletons because only one Facade object is required. (Facade 객체는 종종 싱글톤이 됨)
- State objects are often Singletons. (state 객체는 종종 싱클톤임)
Quiz) SingletonA 클래스와 SingletonB 클래스가 각각 싱글톤 패턴으로 구현되었다고 가정할 때, 다음 코드의 수행 결과는?
SingletonA aRef1, aRef2;
SingletonB bRef1, bRef2;
aRef1 = SingletonA.getInstance( );
aRef2 = SingletonA.getInstance( );
if (aRef1 == aRef2) System.out.print("1"); -> singleton instance
bRef1 = SingletonB.getInstance( );
bRef2 = SingletonB.getInstance( );
if (bRef1 == bRef2) System.out.print("2"); -> singleton instance
if (aRef1 == bRef1) System.out.print("3");
Quiz) O/X 로 답하시오.
- (X) Singleton 패턴에서 객체의 생성을 제어하는 것은 OCP의 적용 예이다.
→ 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 오히려 OCP(개방-폐쇄 원칙)에 위배됨
- (X) 단일체(Singleton) 패턴에서 객체의 생성을 제어하는 것은 ISP의 적용 예이다.
본 글은 개인의 S/W 구조설계 역량 강화를 위한 학습 목적으로 정리된 내용입니다.
일부 타/개인 단체에 저작권이 있는 자료를 포함하고 있으므로, 절대 영리 목적으로 사용하실 수 없습니다.
'SW 공부 > Design Patterns' 카테고리의 다른 글
[디자인패턴] Adapter pattern (어댑터 패턴) (2) | 2022.08.28 |
---|---|
[디자인패턴] Decorator pattern (데코레이터 패턴) (2) | 2022.08.28 |
[디자인패턴] Builder pattern (빌더 패턴) (2) | 2022.08.28 |
[디자인패턴] Factory Method Pattern & Abstract Factory Pattern (팩토리 메서드 패턴 & 추상 팩토리 패턴) (2) | 2022.08.28 |
[디자인패턴] Mediator pattern (중재자 패턴) (2) | 2022.08.28 |
댓글