디자인 모델 독서 노트 의 단일 예 모델

4910 단어
단일 모드 는 하나의 클래스 가 실례 만 있 고 자체 적 으로 실례 화 되 어 전체 시스템 에 실례 를 제공 하도록 확보 하 는 것 이다.이것 은 가장 광범 위 하 게 사용 되 는 모델 일 수도 있 고 가장 널리 알려 진 디자인 모델 일 수도 있다. 내 가 이 요 리 를 한 가지 모델 을 언급 하 더 라 도 게 으 른 사람 모델, 굶 주 린 사람 모델 이라는 명 사 를 두 마디 할 수 있다.
과연 그것 은 어떤 것 일 까? 또 몇 가지 가 있 을 까? 또 어떤 장면 에서 사용 되 는 것 일 까?우 리 는 먼저 그의 사용 장면 을 살 펴 보 자. 위 에서 말 한 바 와 같이 이것 은 하나의 유형 이 있 고 하나의 인 스 턴 스 대상 만 확보 하 는 것 이다. 여러 대상 이 너무 많은 자원 을 소모 하거나 특정한 대상 이 있어 야 하고 하나의 장면 만 있어 야 한다. 예 를 들 어 io 나 데이터 베 이 스 를 방문 하 는 등 비교적 소 모 된 대상 이다.
캐릭터 소개: (1) 클 라 이언 트 - 고 층 클 라 이언 트
(2) SingLecton - - 단일 클래스 가 단일 모드 를 실현 하 는 관건 점: 1. 구조 함 수 는 대외 적 으로 개방 되 지 않 고 private 로 수식 한다. 2. 하나의 정적 방법 이나 매 거 진 을 통 해 대상 을 되 돌려 준다. 3. 단일 대상 이 있 고 하나 밖 에 없다 는 것 을 확보한다. 특히 다 중 스 레 드 상황 에서 4. 단일 대상 이 반 직렬 화 에서 대상 을 재 구성 하지 않도록 확보한다.단일 클래스 의 구조 함수 사유 화 를 통 해 클 라 이언 트 는 new 형식 으로 단일 클래스 의 대상 을 수 동 으로 구성 할 수 없고 단일 대상 이 노출 된 정적 방법 으로 단일 대상 의 유일한 대상 을 얻 을 수 있 으 며 이 유일한 대상 을 얻 을 때 도 스 레 드 의 안전 을 확보 해 야 한다. 즉, 다 중 스 레 드 환경 에서 도 구조의 단일 대상 이 있 고 하나 밖 에 없다 는 것 을 확보 해 야 한다.이것 도 단일 모델 에서 실현 하기 가 비교적 어 려 운 부분 이다.다음은 코드 로 몇 가지 단일 모델 의 표현 형식 을 살 펴 보 자.1. 굶 주 린 남자 모드
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){

    }

    public static Singleton getInstance(){
        return instance;
    }

굶 주 린 모드 는 대상 구조 함 수 를 민영화 합 니 다. new 를 통 해 가 져 올 수 없습니다. 우 리 는 대상 을 정적 으로 설정 하고 성명 할 때 초기 화 합 니 다.정적 방법 으로 만 얻 을 수 있 고 대상 의 유일 성 을 확보 할 수 있 습 니 다.2. 게으름뱅이 모드 (라인 이 안전 하지 않 아 추천 하지 않 음)
public class Singleton {
    private static Singleton instance;

    private Singleton() {

    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

이 모드 는 키워드 synchronized 설명 을 추가 하여 동기 화 방법 으로 다 중 스 레 드 모드 에서 대상 의 유일한 수단 을 확보 합 니 다.문 제 는 첫 번 째 호출 이 초기 화 된 후에 도 getInstance () 방법 을 호출 할 때마다 동기 화 되 고 불필요 한 자원 을 소모 하 는 것 이다. 일반적으로 게으름뱅이 모델 을 정리 하 는 것 을 추천 하지 않 는 다. 장점 은 호출 될 때 만 실례 화 되 고 어느 정도 에 자원 을 절약 하 는 것 이다. 단점 은 첫 번 째 호출 로 딩 이 제때에 정례 화 되 고 반응 이 느 리 며 호출 할 때마다 동기 화 되 는 것 이다.불필요 한 동기 화 지출 을 늘리다.3. DCL 모드
public class Singleton {
    private static Singleton instance=null;

    private Singleton() {

    }
    public static Singleton getInstance(){
        if (instance==null){
            synchronized (Singleton.class){
                if (instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }

프로그램의 하 이 라 이 트 는 getInstance 방법 에 있 습 니 다. 이 방법 에서 인 스 턴 스 를 두 번 째 로 비 우 는 것 입 니 다. 첫 번 째 는 불필요 한 동기 화 를 피하 기 위해 서 입 니 다. 두 번 째 로 비 우 는 것 은 null 의 상황 에서 인 스 턴 스 를 만 들 기 위해 서 입 니 다.자원 소모, 불필요 한 동기 화, 라인 안전 문 제 를 해결 했다.더 자세 한 설명: 인 스 턴 스 = new Singleton () 에 스 레 드 A 가 실 행 될 때 크게 세 가지 일 을 했 습 니 다. Singleton 인 스 턴 스 에 메모 리 를 할당 하고 구조 함 수 를 호출 하 며 필드 를 초기 화하 여 인 스 턴 스 대상 을 할당 하 는 메모리 공간 (이때 Singlecton 은 null 이 아 닙 니 다)
DCL 의 장점: 자원 이 용 률 이 높 고 효율 이 높다 는 단점: 첫 번 째 로 딩 반응 이 느 리 고 자바 메모리 모델 의 원인 으로 인해 가끔 실패 할 수 있 으 며 높 은 병행 환경 에서 어느 정도 결함 이 있다 (확률 이 적다).DCL 은 일례 로 가장 많이 사용 되 는 패턴 이다.4. 정적 내부 모드
public class Singleton {


    private Singleton() {

    }
    public static Singleton getInstance(){
      return SingletonHoulder.instance;
    }

    public static class SingletonHoulder{
        private static final Singleton instance = new Singleton();
    }

정적 내부 방식 정적 내부 모드 는 dcl 모드 가 특정한 상황 에서 효력 을 잃 는 것 을 방지 하기 위해 발생 한 것 입 니 다.5. 매 거 모드
public enum Singleton {  
     INSTANCE;  
     public void whateverMethod() {  
     }  
 }  

이러한 방식 은 Effective Java 작가 Josh Bloch 가 제창 하 는 방식 으로 다 중 스 레 드 동기 화 문 제 를 피 할 수 있 을 뿐만 아니 라 반 직렬 화 를 방지 하여 새로운 대상 을 다시 만 들 수 있다.6. 용기 모드
public class SinglectonManager {
    private static Map objectMap = new HashMap();
    private SinglectonManager(){
    }
    private static void resgisterService(String key,Object instance){
        if (!objectMap.containsKey(key)){
            objectMap.put(key,instance);
        }
    }
    public static Object getService(String key){
       return objectMap.get(key);
    }
}

프로그램 초기 에 여러 가지 단일 유형 을 하나의 통 일 된 관리 클래스 에 주입 하고 사용 할 때 키 에 따라 대응 하 는 대상 을 얻는다. 이런 방식 은 우리 로 하여 금 여러 가지 유형 을 관리 하 게 하고 획득 할 때 통 일 된 인 터 페 이 스 를 통 해 얻 을 수 있 으 며 사용 원 가 를 낮 출 수 있 으 며 구체 적 인 실현 도 숨 기 고 결합 을 낮 출 수 있다.
요약: 장점: 1. 단일 모델 은 메모리 에 하나의 인 스 턴 스 만 있 고 메모리 의 지출 을 줄 였 습 니 다. 특히 한 대상 이 자주 만 들 고 소각 할 때 성능 이 최적화 되 지 못 하 는 장점 이 가장 뚜렷 합 니 다. 2. 시스템 성능 소 비 를 줄 이 고 한 대상 이 비교적 많은 자원 이 필요 할 때 설정 을 읽 고 의존 대상 을 만 들 때 하나의 사례 를 직접 만 들 수 있 습 니 다.그리고 영구적 으로 메모리 에 머 무 르 는 방식 으로 해결 합 니 다.3. 자원 파일 에 대한 다 중 점용 을 피한다. 4. 자원 접근 최적화 와 공유
단점: 1. 인터페이스 가 없 으 면 확장 이 어렵 습 니 다. 2. Context 를 가지 고 있 으 면 메모리 유출 이 발생 하기 쉽 습 니 다 (applicationContext 가 좋 습 니 다)

좋은 웹페이지 즐겨찾기