에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다
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 |