본문 바로가기
SW 공부/Design Patterns

[디자인패턴] Singleton pattern (싱글톤 패턴)

by 꼬냉상 2022. 8. 28.

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 구조설계 역량 강화를 위한 학습 목적으로 정리된 내용입니다.
일부 타/개인 단체에 저작권이 있는 자료를 포함하고 있으므로, 절대 영리 목적으로 사용하실 수 없습니다.
반응형

댓글