에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다
1. 싱글턴 패턴
- 애플리케이션에 하나만 있어도 되는 객체
- 두개 이상일 경우
- 자원을 불필요하게 많이 잡아먹음
- 결과에 일관성 X
- 전역 접근 가능
- 필요할 때만 객체를 생성할 수 있음
사용
- 스레드 풀, 캐시, 다이얼로그, 디바이스 드라이버, 설정 등
2. 구현
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) uniqueInstance = new Singleton();
return uniqueInstance;
}
}
- 정적 메서드
- 생성자 비공개
3. 멀티스레딩 문제
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) uniqueInstance = new Singleton();
return uniqueInstance;
}
}
- 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다리도록 함
효율적인 방법
Eager initialization
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() return uniqueInstance;
}
Double-Checked Locking
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance != null) return uniqueInstance;
synchronized (Singleton.class) {
if (uniqueInstance == null) uniqueInstance = new Singleton();
}
}
}
- 인스턴스가 생성되어 있지 않았을때만 동기화됨
Enum
public enum Singleton {
INSTANCE;
public void doSomething() {
//...
}
}
- Eager Initialization
- 동기화 문제, 클래스 로딩 문제 해결
- jvm에 의해 한번만 인스턴스화됨
- 리플렉션 문제 해결
- 내부적으로 final 키워드가 선언되어 있으므로 추가 생성 불가
- 직렬화 & 역직렬화 문제 해결
- 직렬화 시 새로운 인스턴스가 생성될 수 있음.
- 그러나, 새로운 객체 생성 X.
- INSTANCE가 반환됨
- 리플렉션 문제 해결
'Java > Design Pattern' 카테고리의 다른 글
[헤드퍼스트 디자인 패턴] 7-1. 커맨드 패턴 (0) | 2024.12.17 |
---|---|
[헤드퍼스트 디자인 패턴] 6. 커맨드 패턴 (0) | 2024.12.17 |
[헤드퍼스트 디자인 패턴] 4. 팩토리 패턴 (0) | 2024.12.16 |
[헤드퍼스트 디자인 패턴] 3. 데코레이터 패턴 (1) | 2024.12.16 |
[헤드퍼스트 디자인 패턴] 2. 옵저버 패턴 (0) | 2024.12.16 |