Head First 디자인 모드 노트 4. 단일 모드

단일 모드 는 비교적 간단 하여 전역 의 유일한 대상 을 만 드 는 데 사용 된다.여기에 바로 정의 가 붙 어 있 습 니 다.
단일 모드 는 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
무슨 소 용이 있 습 니까?많은 대상 이 하나 밖 에 없다. 예 를 들 어 작업 관리자, 파일 등 이다.만약 여러 명의 대상 이 있다 면 버그 가 나타 날 것 이다.
그렇다면 전역 정적 변 수 를 이용 하여 단일 대상 을 실현 하 는 것 은 어 떻 습 니까?
  • 전역 정적 변 수 는 전역 접근 을 보장 할 수 있 지만 전역 에 한 대상 만 있 음 을 보장 할 수 없습니다
  • 전역 변 수 를 직접 할당 하면 처음부터 초기 화 해 야 한 다 는 뜻 이다. 만약 에 크 지만 운영 과정 에서 사용 하지 않 으 면 공간의 낭 비 를 초래 할 수 있다.

  • 단일 모드 의 실현
    구조 함수 접근 을 private 로 설계 하면 어떻게 됩 니까?다음 과 같은 코드
    public class Myclass{
         
    	private Myclass(){
         };
    }
    

    이런 종 류 는 실례 화 될 수 있 습 니까?
    구조 함수 가 private 로 설정 되 어 있 기 때문에 이러한 인 스 턴 스 만 호출 할 수 있 지만 구조 함수 없 이 대상 을 예화 할 수 없다 는 것 이 분명 하 다.
    우 리 는 이 구조 함 수 를 호출 하기 위해 정적 함 수 를 하나 더 추가 했다.
    public class Myclass{
         
    	private Myclass(){
         }
    	public static Myclass getInstance(){
         
    		return new Myclass();
    	}
    }
    

    이렇게 하면 이 종 류 를 예화 할 수 있 고 조금 만 수정 하면 한 번 만 예화 할 수 있 는 종 류 를 얻 을 수 있다.
    게으름뱅이
    // NOTE: This is not thread safe!
    
    public class Singleton {
         
    	private static Singleton uniqueInstance;
     	//        ,         
    	private Singleton() {
         }
     
    	public static Singleton getInstance() {
         
    		if (uniqueInstance == null) {
         
    			uniqueInstance = new Singleton();
    		}
    		return uniqueInstance;
    	}
    }
    

    그러나 이렇게 하 는 것 은 결코 안전 한 것 이 아니다.여러 스 레 드 접근 getInstance() 방법 이 있 을 때 여러 대상 을 실례 화 할 수 있 습 니 다.
    게으름뱅이 식, 스 레 드 안전
    거 친 해결 방법 에 우 리 는 getInstance() 방법 에 synchronized 키 워드 를 더 했다.
    public class Singleton {
         
    	private static Singleton uniqueInstance;
     	//        ,         
    	private Singleton() {
         }
     
    	public static synchronized Singleton getInstance() {
         
    		if (uniqueInstance == null) {
         
    			uniqueInstance = new Singleton();
    		}
    		return uniqueInstance;
    	}
    }
    

    그러나 실제로 우 리 는 첫 번 째 호출 getInstance() 만 동기 화 되 어야 동기 화 되 고 동기 화 를 더 하면 불필요 한 효율 이 떨어진다.만약 getInstance() 방법 이 빈번하게 호출 되 어야 한다 면 효율 을 크게 떨 어 뜨 릴 것 이다.
    굶 주 린 사람 식, 스 레 드 안전
    대상 을 만 드 는 데 소모 가 많 지 않다 면 초기 화 할 때 대상 을 예화 하 는 것 을 고려 할 수 있 습 니 다.아래 와 같다
    public class Singleton {
         
    	private static Singleton uniqueInstance = new Singleton(); 
     	//        ,         
    	private Singleton() {
         }
     
    	public static Singleton getInstance() {
         
    		return uniqueInstance;
    	}
    }
    

    초기 화 할 때 단일 사례 를 직접 예화 하 는 이러한 실현 방식 을 우 리 는 '굶 주 린 식' 이 라 고 부 르 는데 주로 대상 이 빈번하게 만 들 어 졌 고 소모 가 크 지 않 은 상황 을 만 드 는 데 사용 된다.이에 대응 하 는 앞의 것 은 사용 할 때 까지 하나의 실현 방식 을 '게으름뱅이 식' 이 라 고 부른다.
    이중 검사 자물쇠.
    그러면 단일 창설 의 소모 가 비교적 크 고 창설 이 빈번 할 수도 있 고 창설 되 지 않 을 수도 있 습 니 다. 어떻게 해 야 합 니까?synchronized 수식 방법 을 사용 하면 동기 화로 인해 불필요 한 성능 이 떨 어 지고, 굶 주 린 한식 창설 방식 으로 초기 화 대상 을 실례 화 할 수 있 으 며, 이 대상 은 실례 화 되 지 않 았 을 수도 있다.
    이중 검사 자 물 쇠 는 우리 가 이 문 제 를 해결 하 는 데 도움 을 줄 수 있다.대상 이 생 성 되 었 는 지 확인 할 수 있 습 니 다. 생 성 되 지 않 았 다 면 동기 화 할 수 있 습 니 다.
    //
    // Danger!  This implementation of Singleton not
    // guaranteed to work prior to Java 5
    //
    
    public class Singleton {
         
    	private volatile static Singleton uniqueInstance;
     	// volatile   uniqueInstance    ,           
    	private Singleton() {
         }
     
    	public static Singleton getInstance() {
         
    		if (uniqueInstance == null) {
         
    		//       ,          
    			synchronized (Singleton.class) {
         
    				if (uniqueInstance == null) {
         
    					uniqueInstance = new Singleton();
    				}
    			}
    		}
    		return uniqueInstance;
    	}
    }
    

    교묘 한 방법 으로 안 타 깝 게 도 1.4 버 전의 이전 자바 버 전에 서 는 수식 자 를 지원 하지 않 는 다 volatile.그 러 니까 쓸 때 자바 버 전 조심 하 세 요.
    단일 모드 의 어두 운 면
    단일 모드 를 사용 하 는 클래스 는 계승 할 수 없습니다. 구조 함수 private 가 수식 되 어 확장 할 수 없 기 때 문 입 니 다.그러나 privataprotected 로 바 꾸 면 또 하나의 모델 을 파괴 하고 다른 유형 도 예화 할 수 있다.만약 하나의 디자인 이 단가 모델 을 대량으로 사용 했다 면 문제 가 있 을 가능성 이 높다.일반적인 상황 에서 사용 장소 가 많 지 않 기 때문이다.

    좋은 웹페이지 즐겨찾기