에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다
1. 싱글턴 패턴
- 애플리케이션 전체에서 하나의 인스턴사만 존재하도록 보장하는 디자인 패턴
항목 | 설명 |
단 하나의 객체만 필요한 경우 | 불필요한 객체 생성을 방지하여 자원 절약 |
결과의 일관성 유지 |
여러 인스턴스가 존재하면 데이터 충돌 및 상태 불일치 위험 발생
|
전역 접근 가능 |
어디서든 동일한 인스턴스에 접근 가능 → 사용 편리
|
지연 초기화 가능 |
필요할 때만 객체 생성 → 메모리 등 리소스 효율성 증가
|
예시) 구현
더보기
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) uniqueInstance = new Singleton();
return uniqueInstance;
}
}
- 정적 메서드
- 생성자 비공개
사용
- 스레드 풀, 캐시, 다이얼로그, 디바이스 드라이버, 설정 등
2. 멀티스레딩 문제
- 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다리도록 함
해결 방법
방식 | 설명 | 장점 요약 |
Eager Initialization | 클래스 로딩 시 인스턴스를 바로 생성 | - 클래스 로딩 시점에 생성됨 - 구현 간단 |
Double-Checked Locking | 인스턴스가 없을 때만 동기화하여 성능 향상 |
- 필요 시점에만 생성
- 동기화 비용 최소화 - 멀티스레딩 안전 |
Enum Singleton | enum으로 싱글턴 정의 (INSTANCE 사용) |
- JVM이 단 한번만 인스턴스 생성
- 리플렉션/직렬화에도 안전 - 내부적으로 final이라 추가 생성 불가 |
예시) 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() {
//...
}
}
'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 |