1. 정의
- 클래스 인스턴스를 하나만 만들고, 메소드를 통한 인스턴스의 전역 접근을 제공한다.
2. 예시
- 두 개의 주소가 같은지 확인한다.
3. 그림
4. 클래스 다이어그램
5. 코드
public class Client {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
isSingleton(singleton1, singleton2);
singleton2 = new Singleton();
isSingleton(singleton1, singleton2);
}
private static boolean isSingleton(Object o1, Object o2) {
if (o1 == o2) {
System.out.println("싱글톤 입니다.");
return true;
}
System.out.println("싱글톤 아닙니다.");
return false;
}
}
/* 출력
싱글톤 입니다.
싱글톤 아닙니다.
*/
public class Singleton {
private static Singleton singleton;
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
https://github.com/kang-seongbeom/design_pattern
💡 Github에서 디자인 패턴 코드를 볼 수 있습니다.
6. 설명
- 오직 하나의 인스턴스만을 생성해서 반환함
7. 참고
- 멀티스레드에서 단 하나의 인스턴스를 보장 못할 수 있음
요청(인터럽트) 1번 스레드 2번 스테드 인스턴스
1번 스레드 요청 | getInstacne() | null | |
2번 스레드 요청 | getInstacne() | null | |
if(singleton == null) | null | ||
1번 타임아웃 | if(singleton == null) | null | |
singleton = new Singleton() | 1번 스레드 인스턴스 생성 | ||
singleton = new Singleton() | 2번 스레드 인스턴스 생성 |
- DCL(Double-Checked Locking)을 사용해 멀티스레드 문제를 해결할 수 있음
public class MultiThreadSingleton {
private volatile static MultiThreadSingleton singleton;
public static MultiThreadSingleton getInstance(){
if(singleton == null){
synchronized (MultiThreadSingleton.class){
if(singleton == null){
singleton = new MultiThreadSingleton();
}
}
}
return singleton;
}
}
'디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 어댑터 패턴(Adapter Pattern) (0) | 2022.11.17 |
---|---|
디자인 패턴 - 커맨드 패턴(Command Pattern) (0) | 2022.11.17 |
디자인 패턴 - 팩토리 메소드 패턴(Factory Method Pattern) (0) | 2022.11.17 |
디자인 패턴 - 추상 팩토리 패턴(Abstract Factory Pattern) (0) | 2022.11.17 |
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2022.11.17 |