CoreJava 디자인 모델 의 단일 예 모드

4277 단어 디자인 모드
디자인 모델 의 단일 예 모델
1. 단일 모드 의 역할:
전체 프로그램 이 한 번 에 실행 되 는 과정 에서 단일 모드 로 설명 되 는 클래스 의 대상 이 있 고 하나 밖 에 없어 야 합 니 다.
2. 실 현 된 장면:
서로 다른 응용 장면 에 대해 단일 모델 의 실현 요구 도 다르다.
3. 단일 모델 의 몇 가지 실현 방식
(1) 가장 기본 적 인 단일 사례 실현:
실현 절차:
1. 구조 방법 을 사유 화하 여 외부 에서 new 방식 으로 대상 을 직접 만 들 수 없 도록 한다.
2. 대외 적 으로 인 스 턴 스 를 얻 는 정적 방법 을 제공 하여 얻 을 수 있 는 방식 을 확보한다.
3. 클래스 내부 에 이러한 대상 을 만 들 고 공 개 된 정적 방법 으로 되 돌려 줍 니 다.
public class BasicSingleTon {

    //      
    private static final BasicSingleTon instance = new BasicSingleTon();

    //               
    public static BasicSingleTon getInstance() {
        return instance;
    }

    //         
    private BasicSingleTon() {
    }
}

그 중에서 Basic SingleTon 의 실례 화 대상 인 인 스 턴 스 를 개인 적 인 정적 인 최종 대상 으로 설정 합 니 다. 그 중에서 final 은 대상 이 방법 영역 에서 의 주 소 를 바 꿀 수 없 도록 하기 위해 서 일 뿐 대상 의 초기 화 시기 에 영향 을 주지 않 습 니 다.final 을 더 하 는 게 좋 을 것 같 아 요.
(2) 굶 주 린 식 (정적 내부 류)
//   
class A{
	private static final A instance = new A();
	public static A newInstance(){
		return instance;
	}
	private A(){}
}

단점: 속성 을 초기 화하 면 대상 을 만 듭 니 다. 호출 되 지 않 았 을 때 공간 메모 리 를 계속 사용 하고 메모 리 를 낭비 합 니 다.
(3) 게으름뱅이 식
//   
class B{
	private static B instance = null;
	public static synchronized B newInstance(){
		if(instance == null)instance = new B();
		return instance;
	}
	private B(){}
}

단점: 대상 을 얻 는 정적 방법 은 자 물 쇠 를 채 우 는 것 이기 때문에 병행 효율 이 낮 고 시간 을 낭비 합 니 다.
(4) 게 으 름 종합 식 (장한 식)
정적 내부 클래스 방식 을 이용 한 단일 사례 구현:
생각:
1. 이 클래스 의 대상 을 정적 내부 클래스 의 초기 화 작업 에 의존 하도록 되 돌려 줍 니 다.
2. 이 정적 내부 클래스 가 초기 화 될 때 외부 클래스 의 대상 을 생 성 한 다음 getInstance 에서 되 돌려 줍 니 다.
초기 화 된 설명:
이 초기 화 는 JVM 클래스 를 불 러 오 는 과정 에서 - > 링크 (검증, 준비, 해석) - > 초기 화 에서 초기 화 하 는 것 을 의미 합 니 다.이 초기 화 과정 은 클래스 의 정적 변수 에 구체 적 인 값 을 부여 합 니 다.
한 종류의 초기 화 시기 에 대해 몇 가지 상황 이 있 습 니 다.
1) new 키 워드 를 사용 하여 대상 을 예화 할 때, 클래스 의 정적 필드 를 읽 거나 설정 할 때 (final 에 의 해 수식 되 고, 컴 파일 기간 에 결 과 를 상수 탱크 에 넣 은 정적 필드 를 제외), 그리고 클래스 의 정적 방법 을 호출 할 때.
2) 자바. lang. reflect 패 키 지 를 사용 하여 클래스 를 반사 호출 할 때 클래스 가 초기 화 되 지 않 았 다 면 초기 화 를 먼저 촉발 해 야 합 니 다.
3) 클래스 를 초기 화 할 때 부모 클래스 가 초기 화 되 지 않 은 것 을 발견 하면 먼저 부모 클래스 의 초기 화 를 촉발 해 야 한다.
//     
class C{
	private static class Holder{
		static C instance = new C();
	}
	public static C newInstance(){
		return Holder.instance;
	}
	private C(){}
}

(5) 이중 판 공 식 의 다 중 스 레 드 단일 사례 실현
synchronized 를 get 대상 으로 하 는 정적 방법 으로 자 물 쇠 를 잠 그 면 효율 에 영향 을 줄 수 있 는 상황 에 대해 서 는 한 번 만 더 띄 우 면 효율 을 최적화 할 수 있 습 니 다.
코드 구현:
public class SyncSingleTon {

    private static SyncSingleTon singleTon = null;

    public static SyncSingleTon getInstance() {

        //        ,             getInstance           
        if (singleTon == null) {
            synchronized (SyncSingleTon.class) {
                if (singleTon == null) {
                    singleTon = new SyncSingleTon();
                }
            }
        }
        return singleTon;
    }

    private SyncSingleTon() {
    }
}

(6) 단일 사례 의 가장 간단 한 실현 (enum  매 거 실현
매 거 진 단일 모드 를 실현 하 는 이 유 는 매 거 진 자체 가 스 레 드 안전 하기 때문이다.
생각:
매 거 진 사상 은 공 통 된 정적 final 과 매 거 진 상수 에서 인 스 턴 스 를 내 보 내 는 클래스 입 니 다. 매 거 진 상수 의 구조 방법 을 사용 하여 대응 하 는 대상 을 만 들 수 없 기 때 문 입 니 다.
public enum  EnumSingleTon {
    INSTANCE
}

public class SingleTon {
    public static void main(String[] args) {
        EnumSingleTon instance = EnumSingleTon.INSTANCE;
        EnumSingleTon instance1 = EnumSingleTon.INSTANCE;

        System.out.println("instance1 == instance = " + (instance1 == instance));//      true
    }
}

면접 문제:
단일 모델 은 면접 에서 자주 만 날 수 있 습 니 다. 프로그래머 의 기 초 를 닦 는 탄탄 한 정도 이기 때 문 입 니 다. 면접 관 에 게 프로젝트 를 했다 고 말 하면 면접 관 이 단일 디자인 모델 을 몇 개 쓰 라 고 했 습 니 다. 쓰 지 못 하면 면접 관 이 믿 을 것 같 습 니까?면접 을 볼 때 매번 의 면접 을 열심히 준비 해 야 합 니 다. 흔 들 림 으로 설령 당신 이 합격한다 하 더 라 도 당신 은 이 회사 에 만족 하지 않 을 가능성 이 높 습 니 다. 자, 우 리 는 본론 으로 들 어 갑 니 다. 사실 단일 디자인 모델 은 면접 에서 굶 주 린 사람 에 게 쓰 는 방법 을 묻 는 사람 이 별로 없습니다. 보통 단일 계획 모델 의 게으름뱅이 식 스 레 드 안전 문 제 를 물 어 봅 니 다.그래서 여러분 들 은 반드시 단일 모델 의 스 레 드 안전 문 제 를 충분히 이해 해 야 합 니 다. 이 몇 가지 모델 에 대해 시간 을 들 이 고 열심히 배 워 야 합 니 다. 면접 에서 단일 모델 에 관 한 어떤 문제 도 두려워 하지 않 을 것 입 니 다. 그 렇 죠?
Best wish!

좋은 웹페이지 즐겨찾기