[싱글턴 패턴의 목적]
: 클래스가 한개의 인스턴스(객체)만을 만들수 있도록 하고, 어디서나 앞서 생성된 인스턴스에 접근할 수 있도록 함.
: 여러객체가 호출될때마다 생성되면 상태관리가 어려워지기에, 객체 생성자를 중앙에서 관리
[싱글턴 패턴의 구현]
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;
}
// 나머지 메소드에 해당되는 부분... 생략
}
'기타 > [고급객체지향 프로그래밍]' 카테고리의 다른 글
디자인 패턴 7강. 어댑터 패턴과 퍼사드 패턴(Adapter, Facade Pattern) (0) | 2019.12.12 |
---|---|
디자인 패턴 6강. 커맨드 패턴(Command Pattern) (0) | 2019.12.10 |
디자인 패턴 4강. 팩토리 패턴(Factory pattern) (0) | 2019.12.02 |
디자인 패턴 3강. Decorator 패턴 (0) | 2019.10.21 |
디자인 패턴 2강. Observer 패턴 (0) | 2019.10.20 |