디자인 모드 (1) -- 단일 모드 (singleton)

3778 단어 디자인 모드
단일 모델 은 면접 에서 가장 많이 묻 는 모델 문제 중 하나 다.단일 사례 가 무엇 인지, 왜 단일 사례, 단일 모델 의 불합리한 실현 방법 문 제 는 여기 서 토론 하지 않 습 니 다.다음은 단일 사례 모델 에 대한 이 해 를 깊이 있 게 기록 할 것 이다.
1. 하나의 문 제 는 단일 코드 를 쓸 때 반드시 기억 해 야 한다. 그것 은 어떤 쓰기 든 지 간 에 반드시 개인 적 인 구조 함 수 를 써 야 한 다 는 것 이다. 그렇지 않 으 면 의외 의 사례 화 를 진정 으로 막 을 수 없다.사유 구조 함수 도 상속 의 존 재 를 방지 했다.
2. synchronized, volatile 이 버 려 진 이 유 는 두 가지 가 있 습 니 다. 하 나 는 효율 문제 입 니 다.둘째, synchronized 는 다 중 스 레 드 환경 에서 CPU 의 명령 재 정렬 과 클래스 로드 초기 화 메커니즘 으로 인해 스 레 드 1 이 인 스 턴 스 로 메모 리 를 할당 하고 문자 참조 가 메모리 에 있 을 때 이러한 대상 을 초기 화하 지 않 을 수 있 습 니 다.이 때 스 레 드 2 경쟁 에서 cpu 를 얻 으 면 if (instance = null) 가 false 를 얻 을 수 있 음 을 판단 하고 코드 를 실행 할 때 빈 포인터 오류 가 발생 합 니 다.이 럴 때 는 volatile 명령 으로 정렬 을 금지 하지만, volatile 은 사용 중 성능 에 문제 가 있 을 수 있 습 니 다.
3.private static final Singleton singleton = new Singleton();문 제 는 당신 이 클래스 에 적재 할 때 새로운 대상 이 생 긴 다 는 것 입 니 다. 하지만 maybe 는 아직 그 를 사용 하고 싶 지 않 습 니 다.!이때 우 리 는 내부 류 로 이 변 수 를 포장 할 수 있다.이것 도 매우 주의해 야 할 점 이다. 클래스 를 불 러 올 때 내부 클래스 는 동시에 불 러 오지 않 고 내부 클래스 를 사용 할 때 불 러 오기 때문에 아래 의 첫 번 째 쓰기 가 있다.
4. implements Serializable 에 부 딪 혔 을 때 반 직렬 화 될 때 만 든 대상 은 또 하나의 새로운 대상 의 문제 입 니 다.이것 은 readresolve 방법 으로 간단하게 해결 할 수 있 습 니 다.반 사 를 만 났 을 때 문제 가 발생 했 습 니 다. 일부 공격 수단 은 반 사 를 통 해 private 의 구조 함수 로 설명 되 더 라 도 호출 할 수 있 습 니 다.
종합 적 으로 가장 중요 한 것 은 두 가지 기법 을 기억 하 세 요. 첫 번 째 는 모든 곳 이 관건 적 이 고 모두 구덩이 이 므 로 이해 + 단단 한 등 이 필요 합 니 다.
public class Single(){
    private Single(){}//         !

    //static                      
    //private   !           Holder
    private static class Holder{
        private static final Single INSTANCE = new Single();
    }

    //static        ,final        
    public static final Single getInstance(){
        return Holder.INSTANCE;
    }
}

두 번 째 글 씨 는 강요 에 못 이 겨 매 거 진 Enum 을 사용 했다.매 거 진 지식 을 조금 더 공 고 히 하 세 요.이것 은 다소 이상 하 다. 실제로 하나의 클래스 Color 를 설명 하 는 것 이다. 이 Color 는 Enum 을 계승 하고 자바. lang. Enum 의 하위 클래스 이다.이 Color 를 쓸 때 이 Color 류 는 RED, GREEN 과 같은 몇 가지 인 스 턴 스 가 있어 야 합 니 다.그들 은 기본적으로 Public static final 이다.2. 매 거 유형의 기본 구조 함 수 는 개인 적 인 것 이 고 자신 도 private 또는 기본 단계 의 구조 함수 만 정의 할 수 있 습 니 다.계승 과 외부 가 통제 되 지 않 는 실례 화 를 방지 하 다.3. Serializable 이 실현 되 었 지만 직렬 화 방법 을 덮어 쓸 때 직접 throw new InvalidObjectException("can't (de)serialize enum"); 은 직렬 화 될 수 없다 는 것 을 나타 낸다.4. 반사 클래스 Constructor 의 new Instance 방법 에서:
if ((clazz.getModifiers() & Modifier.ENUM) != 0)   
    throw new IllegalArgumentException("Cannot reflectively create enum objects");

매 거 하 더 라 도 일반적인 반사 체 제 는 지원 되 지 않 는 다.
다시 말 하면 매 거 진 것 은 아주 좋 은 단일 모드 쓰기 입 니 다. 유일한 문제 의 매 거 진 은 내부 클래스 를 사용 하 는 것 처럼 로드 를 지연 시 킬 수 없습니다.그러나 항상 기억 해 야 한다. 복잡 한 문법 이나 실현 으로 뚜렷 하지 않 은 성능 최 적 화 를 추구 하지 말 아야 한다.최적화 보 다 는 합 리 적 인 추구 가 필요 하 다 는 얘 기다.
public enum Singleton{
    INSTANCE //   ;     
}

좋은 웹페이지 즐겨찾기