[자바 디자인 모델] - 디자인 모델 의 단일 사례 모델 에 대해 논 합 니 다.

4840 단어 디자인 모드
우리 가 평소에 프로 그래 밍 을 하 는 과정 에서 코드 를 가장 많이 두 드 린 것 은 new Xxx () 일 것 이다. 이것 도 우리 가 평소에 대상 을 대상 으로 프로 그래 밍 하 는 고유 한 방법 이기 때문이다.(반 사 를 통 해 하나의 인 스 턴 스 를 만 들 수 있 지만)그러나 여러분 은 일부 장면 에서 만 났 는 지 아 십 니까? 어떤 상황 에서 저 는 현재 클래스 에 하나의 실례 만 있 기 를 바 랍 니 다.메모리 에 이런 대상 이 하나 밖 에 없다 는 것 이다.예 를 들 어 에서 '어떤 유형 도 출산 계획 이 필요 하 다' 는 말 이 있다.누 군 가 는 여기 서 의문 이 생 길 수 있 습 니 다. 저 는 new 와 같은 현재 의 대상 만 있 으 면 끝 나 는 것 이 아 닙 니까?아니면 이런 대상 이 필요 한 클래스 에 이런 대상 을 직접 써 도 되 지 않 을까요?그러나 당신 은 이 종류의 대상 이 다른 클래스 에서 두 번 째 대상 을 만 들 수 없다 는 것 을 보증 할 수 있 습 니까?그러면 디자인 모델 에서 이런 해결 방법 이 있다. 단일 모델 이다.세 마디 로 단일 모델 을 요약 하 는 관건 은 다음 과 같다. 1. 이 유형의 대상 은 다른 클래스 에서 만 들 수 없다 (구조 기 개인).2. 이 종 류 는 자신 과 같은 인 스 턴 스 를 가진다.3. 이 종 류 는 정적 인 방법 을 제공 하여 다른 종 류 는 이러한 인 스 턴 스 를 가 져 올 수 있 도록 합 니 다. 즉, 가 져 오기 (2).다음 코드 참조:
public class SingleClass{
    private static SingleClass instance = new SingleClass();

    private SingleClass(){
    }

    public static SingleClass getInstance(){
        return instance;
    }
    someOtherMethod ...
}

위의 코드 를 비교 해 보면 하나, 둘 을 볼 수 있 을 것 같다.이러한 구조 기 는 개인 적 으로 공공 구조 기 를 제공 하지 않 아서 다른 유형 에서 new SingleClass () 를 통과 하지 못 하도록 보장 합 니 다.대상 을 만들다.이런 종 류 는 자신의 대상 을 가지 고 있다.이러한 대상 을 조작 할 수 있 는 유일한 방법 은 정적 방법 인 getInstance 를 통 해 이 루어 집 니 다.그러면 이 종 류 는 어디서 사용 하 든 현재 클래스 의 대상 만 포함 하고 있다 는 것 을 보증 할 수 있다.이렇게 하면 통제 욕 이 강 한 사람들 이 원 하 는 것 을 크게 만족 시 켰 다. 유일한 것 만 있 을 수 있다.시원 하 다아직 기분 나 쁘 지 않 아!이전 클래스 의 대상 이 정적 으로 변 했 을 때 이 클래스 를 불 러 오 는 동시에 메모리 에 이러한 인 스 턴 스 가 존재 합 니 다.이렇게 하면 네가 사용 하 든 안 하 든 나 는 메모 리 를 차지 하고 시스템 자원 을 미리 소모 할 수 있다.인 스 턴 스 생 성 을 내 가 필요 로 할 때 뒤로 미 룰 수 있 습 니까?네, 보 세 요.
public class SingleClass{
    private static SingleClass instance;

    private SingleClass(){
    }

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

이렇게 하면 요 구 를 만족 시 켰 습 니까?내 가 이 대상 을 필요 로 할 때 그것 을 만 들 고 있다.하지만 세심 한 동료 가 문 제 를 발견 했다.다 중 스 레 드 환경 에서 두 스 레 드 는 getInstance 방법 을 동시에 호출 합 니 다.호출 하기 전에 인 스 턴 스 가 비어 있 는 것 을 발견 하 는 동시에 스 레 드 2 도 이곳 에 실 행 했 습 니 다. 이것 은 스 레 드 가 초기 화 되 었 고 그 후에 스 레 드 2 가 다시 초기 화 되 었 습 니 다.변 수 를 두 번 초기 화 합 니 다.해결 방법: 스 레 드 잠 금!코드 다시 보기:
public static SingleClass getInstance(){
        synchronized (SingleClass.class) {
            if(instance == null){
                instance = new SingleClass();
            }
            return instance;
        }
    }

이렇게 정적 getInstance 방법 을 바 꾸 면 좋 을까요?사실 별로 좋 지 않 아 요. 효율 이 너무 낮 아 요.나 는 단지 실례 화 할 때 임계 구역 에 자 물 쇠 를 채 워 야 할 지도 모 르 지만, 지금 은 네가 실례 화 되 었 든 안 되 었 든 두 라인 이 만나면 막 힐 것 이다.어떻게 하면 좋 을까요?마지막 으로 코드 를 올 려 보 세 요, 통 들:
public static SingleClass getInstance(){
        if(instance == null){
            synchronized (SingleClass.class) {
                if(instance == null){
                    instance = new SingleClass();
                }
            }
        }
        return instance;
    }

보 세 요. 이렇게 펜 레 대상 을 예화 한 후에 대상 의 인용 으로 돌아 갑 니 다.초기 화 전에 스 레 드 안전 문제 가 존재 하면 잠 금 판단 을 추가 하면 실례 화 를 보장 할 수 있 습 니 다!
두 번 의 코드 는 끊 임 없 는 진화 과정 에서 개선 되 었 다.매번 이전의 코드 에 대한 탐색, 최적화, 재 탐색, 재 최적화.클래스 로드 에서 직접 예화 하 는 것 은 '게으름뱅이 식' 입 니 다. 무작정 먼저 예화 해 드 리 겠 습 니 다.방법 을 통 해 대상 을 방문 하고 초기 화 하 는 것 은 '굶 주 린 사람 식' 이다.게 으 른 사람 은 자원 을 소모 하고, 굶 주 린 사람 은 안전 문제 가 있다.이 해 를 배 운 후에 이해득실 을 따 져 야 한다.적절하게 사용 하 다.상속 후 존재 하 는 문제점 도 후속 논평 구 에서 논의 할 수 있 으 니 댓 글 지적 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기