디자인 패턴 5강. 싱글턴 패턴(Singleton Pattern)

기타/[고급객체지향 프로그래밍]

2019. 12. 6. 16:03

 

[싱글턴 패턴의 목적]

: 클래스가 한개의 인스턴스(객체)만을 만들수 있도록 하고, 어디서나 앞서 생성된 인스턴스에 접근할 수 있도록 함.

: 여러객체가 호출될때마다 생성되면 상태관리가 어려워지기에, 객체 생성자를 중앙에서 관리

 

 

[싱글턴 패턴의 구현]

1. 기본적인 싱글턴 패턴의 구현

public class Singleton {
  // Singleton 클래스의 유일한 인스턴스 저장용 변수(private)
  private static Singleton uniqueInstance;
  // 기타 멤버변수...
  
  private Singleton() {}
  
  public static Singleton getInstance() { //객체 생성위해 외부에서 접근가능한 유일한 메소드
    if (uniqueInstance == null ) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
  
  // 기타메소드...
}

: 이제 외부에서 이 클래스에 대한 객체가 필요할때, ' = new Singleton() ' 이 아닌 ' = singleton.getInstance() ' 로 객체 생성한다.

 

2. Thread-safe 버전의 싱글턴(기본)

: 여러 스레드에서 동시에 객체 생성하는 경우엔 위 코드의 경우에는 중복 생성되는 문제 발생할 수 있기에 그에 따른 해결책

...
  public static synchronized Singleton getInstance() { // synchronized를 넣어 동기화작업
    ...
...

 

3. 개선된 Thread-safe 버전의 싱글턴(시작시 생성)

: synchronized 써도 되지만 느려질수 있다. 그래서 애초에 프로그램 시작하는 시점에서 객체를 생성해 놓는 방법

public class Singleton {
  // 인스턴스를 필요할때가 아닌 프로그램 시작될때 생성
  private static Singleton inst = new Singleton(); 
  private Singleton() {}
  public static Singleton getInstance() {
    return inst;
  }
  //...
}

 

4. Thread-safe 버전의 싱글턴2 (volatile)

: 여러개의 스레[드에서 해당 클래스 사용하려 할때 스레드 CPU 들의 캐시값 불일 치 해결

public class Singleton {
  private volatile static Singleton inst = new Singleton();  //volatile
  ...
}

 

 

 

[싱글턴 패턴 예제]

1. 초콜릿 공장(파일 존재)

더보기
public class ChocolateBoiler {
    private static ChocolateBoiler chocolateBoiler; // 싱글턴 패턴 위한
    private boolean empty;
    private boolean boiled;

    private ChocolateBoiler(){  // 생성자를 이용한 통상태와 가열 상태 초기화
        empty = true;
        boiled = false;
    }
    public ChocolateBoiler getInstance(){ // 싱글턴 패턴 용 메소드
        if (chocolateBoiler == null){
            chocolateBoiler = new ChocolateBoiler();
        }
        return chocolateBoiler;
    }
    // 나머지 메소드에 해당되는 부분... 생략
}