디자인 모델 꼬치 꼬치 - 단일 모델 (Singleton Pattern)

5205 단어
오리지널 - 전재http://tramp.cincout.cn/2016/10/08/introduction-of-singleton-design-pattern/
개술
단일 모델 은 간단 하면 서도 복잡 한 모델 이다.간단하게 그것 이 실현 하고 자 하 는 목 표를 이해 하기 쉽 고 복잡 하 게 라인 의 안전 한 단일 모델 을 쓰 는 것 은 쉽 지 않다.단일 모드 의 핵심 정 의 는 클래스 가 하나의 인 스 턴 스 만 있 는 지 확인 하고 이 인 스 턴 스 를 방문 하 는 전역 접근 점 을 제공 하 는 것 입 니 다 (Ensure a class has only instance, and provide a global point of access to it).
단일 모드 의 실현
단일 모드 의 실현 은 급 한 (Eager) 과 지연 되 는 (Lazy), 스 레 드 안전 (Thread - safe) 과 비 스 레 드 안전 (Non - Thread - safe) 몇 가지 로 나 뉜 다.다음은 자바 가 단일 모델 의 실현 에 대해 소개 한다.
Eager 모드 구현
Eager 모드 의 실현 은 보통 정적 인 단일 필드 에서 설명 할 때 (또는 단일 클래스 의 구조 함수) 이 단일 사례 의 대상 을 만 듭 니 다.이렇게 하면 단일 클래스 가 자바 가상 컴퓨터 에 불 러 올 때 이 단 예 를 실례 화 할 수 있다.
정적 영역 기반 Eager 모드
public class StaticSingleton implements Serializable {
    private static StaticSingleton INSTANCE = new StaticSingleton();

    private StaticSingleton() {}

    public static StaticSingleton getInstance() {
        return INSTANCE;
    }

    /**
     *                
     * @return
     */
    private Object readResolve() {
        return INSTANCE;
    }
}

정적 블록 에 초기 화
public class Singleton {  
    private Singleton instance = null;  
    static {  
        instance = new Singleton();  
    }  
    private Singleton (){}  
    public static Singleton getInstance() {  
        return this.instance;  
    }  
} 

기본 Java Enum 에서 구현 되 는 Eager 모드
자바 매 거 진 모델 이 실 현 된 단 례 는 다음 과 같이 추앙 받 고 있 기 때문이다.
  • 절대적 인 스 레 드 가 안전 하고 자바 가상 컴퓨터 가 보증 합 니 다
  • 반 직렬 화 때문에 하나의 인 스 턴 스 가 발생 하지 않 고 Enum 은 바 텀 에서 readResolve () 방법
  • 을 실현 했다.
  • 엔 럼 타 입 은 자바 밑바닥 에 abstract 로 장 식 된 클래스 이기 때문에 예화 되 지 않 아 반사 공격 을 막 을 수 있다.반사 체 제 는 개인 적 인 구조 대상
  • 을 호출 할 수 있 기 때문이다.
    public enum  EnumSingleton {
        INSTANCE;
    
        private Object singleton;
    
        public void print(String name) {
            System.out.println("Hello : " + name);
        }
    
        public Object build() {
            singleton = new Object();
            return singleton;
        }
    }
    
    class Client {
        public static void main(String[] args) {
            EnumSingleton.INSTANCE.print("hello");
            Object object = EnumSingleton.INSTANCE.build();
        }
    }
    

    Lazy 모드 구현
    Eager 모드 의 실현 은 스 레 드 문 제 를 피 할 수 있 지만 단일 대상 이 불 러 와 야 할 시스템 자원 이 많 을 때 시스템 이 시작 할 때 느 릴 수 있 습 니 다.따라서 이 대상 을 사용 할 때 구조 하 는 방식 이 필요 하 다.단 례 로 이 뤄 지 는 레이 지 모드 다.
    비 스 레 드 보안 레이 지 모드
    지연 실례 화 방식 을 채택 하면 단일 대상 의 구 조 를 첫 번 째 호출 때 까지 늦 출 수 있다.이 방식 은 비 스 레 드 안전 (Non - Thread - Safe) 임 이 분명 하 다.
    public class Singleton {  
            private static Singleton singleton = null;  
              
            private Singleton() {}  
              
            public static Singleton getSingleton() {  
                if (singleton == null) {  
                    // can be interrupted to other thread
                    singleton = new Singleton();  
                }  
                return singleton;  
            }  
        }
    

    안전 한 레이 지 모드
    방법 에 자 물 쇠 를 추가 하면 이 단일 모델 이 다 중 스 레 드 환경 에서 의 안전성 을 확보 할 수 있 으 나 성능 은 심각 한 영향 을 받 을 것 이다.단일 대상 이 생 성 되면 대상 의 상호 배척 자 물 쇠 를 동기 화 할 필요 가 없 기 때문이다.
    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    } 
    

    정적 내부 클래스 기반 방식
    내부 정적 클래스 Singleton Holder 는 Singleton 클래스 가 불 러 올 때 실례 화 되 지 않 으 며, getInstance () 디 스 플레이 에서 호출 될 때 불 러 옵 니 다.따라서 레이 지 로드 도 가능 하 다.
    public class Singleton {  
        private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
        }  
        private Singleton (){}  
        public static final Singleton getInstance() {  
            return SingletonHolder.INSTANCE;  
        }  
    }  
    

    DCL 기반 Lazy 모드
    DCL (Double Checked Locking) 은 volatile 의 사용 에 맞 춰 이중 검 사 를 하여 스 레 드 안전 과 로드 지연 을 만족 시 킬 수 있 습 니 다.
    /** Lazy load thread safe
     * Created by zhaoyu on 16-8-31.
     */
    public class DoubleCheckedLockingSingleton {
        private volatile DoubleCheckedLockingSingleton INSTANCE;
    
        private DoubleCheckedLockingSingleton() {}
    
        public DoubleCheckedLockingSingleton getInstance() {
            if (INSTANCE == null) {
                synchronized (DoubleCheckedLockingSingleton.class) {
                    if (INSTANCE == null) {
                        INSTANCE = new DoubleCheckedLockingSingleton();
                    }
                }
            }
            return INSTANCE;
        }
    }
    

    단일 모드 의 사용 장면
  • 프로젝트 에서 공 유 된 액세스 포인트 나 공 유 된 데이터, 예 를 들 어 시스템 설정 정보
  • 시스템 이 너무 많은 자원 을 소모 하 는 대상 을 만 듭 니 다. 예 를 들 어 IO 와 데이터 베 이 스 를 방문 하 는 등 자원
  • 웹 에서 단일 모드 로 계수기 의 값 을 유지 하고 라인 안전 을 확보 합 니 다
  • 유일한 시퀀스 ID 를 생 성 하 는 장면
  • 총결산
    단일 모드 (Singleton Pattern) 는 광범 위 하 게 사용 되 는 모델 로 서 시스템 의 메모리 소 비 를 줄 이 고 시스템 의 성능 을 향상 시 킬 뿐만 아니 라 시스템 자원 에 대한 과도 한 점용 도 피 할 수 있다.단일 모드 를 사용 할 때 는 다 중 스 레 드 환경 에서 사용 할 지 여 부 를 고려 해 야 한다.현재 Enum 기반 구현 은 현재 추천 하 는 단일 구현 방식 이다.한 마디 로 하면 단일 모델 의 사용 은 실제 환경 에서 수요 에 따라 적당 한 실현 방식 을 선택해 야 한다.
    참조 참조
  • 단일 모드
  • 디자인 모델 - 단일 모델 - TRAMPZZY
  • 좋은 웹페이지 즐겨찾기