단일 모드 의 몇 가지 형식

3986 단어 android
개술
        Android 에서 우리 가 가장 많이 사용 하 는 디자인 모델 은 단일 모델 일 것 이다. 단일 모델 도 가장 간단 한 디자인 모델 이다. 만약 에 대상 이 응용 에서 전체 국면 에서 유일한 것 이 라면 우 리 는 단일 모델 을 사용 할 수 있 고 Android 시스템 에서 도 단일 모델 을 대량으로 사용 할 수 있다.그렇다면 단일 모드 에는 어떤 문법 이 있 을 까?각 서법 의 장단 점 은 또 어떤 것 입 니까?
2. 단일 모드 의 쓰기
1. 굶 주 린 사람 식
굶 주 린 한식 은 가장 간단 한 단일 모델 정의 방법 이다. 먼저 우 리 는 유형의 구조 방법 을 private 로 정의 해 야 한다. 그러면 외부 에서 구조 함 수 를 통 해 대상 을 생 성 할 수 없다.그 다음 에 우 리 는 정적 인 대상 을 정의 하고 구조 방법 으로 그 값 을 부여 해 야 한다.마지막 으로 우리 가 정의 하 는 정적 대상 에 접근 하 는 Public 방법 을 제공 합 니 다.구체 적 인 코드 는 다음 과 같다.
장점: 간단 하고 편리 함
단점: 프로그램 에서 단일 대상 을 사 용 했 든 안 했 든 단일 대상 을 생 성 합 니 다. 또한 정적 대상 은 클래스 로 딩 할 때 생 성 되 어야 하기 때문에 응용 프로그램의 시작 속 도 를 낮 출 수 있 습 니 다.
적용: 클래스 대상 기능 이 간단 하고 메모리 사용량 이 적 으 며 사용 이 빈번 합 니 다.
적용 되 지 않 음: 클래스 대상 기능 이 복잡 하고 메모리 사용량 이 많 으 며 사용 확률 이 낮 음
2. 게으름뱅이
게으름뱅이 식 은 굶 주 린 한식 에 비해 정적 대상 의 생 성 은 하나의 인 스 턴 스 를 사용 할 때 만 생 성 되 는 것 이지 응용 이 시 작 될 때 구 조 를 구성 하 는 것 이 아니 라 응용 에서 하나의 대상 을 사용 하지 않 으 면 하나의 대상 을 구성 하지 않 는 다 는 것 이다.구체 적 인 코드 는 다음 과 같다.
4. 567913. 이러한 단일 모델 의 정 의 는 게 으 른 로드 방식 을 사용 합 니 다. 즉, 필요 할 때 단일 대상 을 구성 하고 단일 스 레 드 모델 에 대해 이렇게 정의 하 는 것 은 문제 가 없 지만 다 중 스 레 드 모델 이 라면 여러 개의 단일 대상 을 구성 할 수 있 습 니 다. 만약 에 여러 스 레 드 가 동시에 getInstance 를 호출 하여 단일 대상 을 얻 을 수 있 습 니 다.단일 대상 이 비어 있 는 지 아 닌 지 를 판단 할 때 모두 성립 될 수 있다. 그러면 여러 개의 단일 대상 을 구성 할 수 있다. 게으름뱅이 식 의 정의 방식 의 가장 큰 문 제 는 스 레 드 가 안전 하지 않다 는 것 이다.
장점: 단일 대상 의 생 성 은 응용 이 단일 대상 을 사용 해 야 할 때 만 구 조 를 구성 하여 응용 시작 속 도 를 높 일 수 있다.
단점: 스 레 드 가 안전 하지 않 습 니 다. 여러 스 레 드 가 getInstance 방법 을 동시에 호출 하면 여러 개의 단일 대상 이 생 성 될 수 있 습 니 다.
적용: 단일 대상 의 기능 이 복잡 하고 메모리 사용량 이 많 으 며 응용 프로그램의 시작 속도 에 대한 요구 가 있 습 니 다.
적용 되 지 않 음: 다 중 스 레 드 동시 사용
3. 게으름뱅이 동기 자물쇠
게으름뱅이 식 단일 모델 의 문 제 는 스 레 드 가 안전 하지 않다 는 것 이다. 그러면 우리 가 스 레 드 보호 체 제 를 더 하면 문 제 는 해결 되 지 않 을 까?게으름뱅이 동기 화 자 물 쇠 는 게으름뱅이 식 에 스 레 드 동기 화 자 물 쇠 를 더 해 스 레 드 안전 을 확보 한 것 이다.구체 적 인 코드 는 다음 과 같다.
public class SingleTonOne {
    private final static SingleTonOne singleTonOne = new SingleTonOne();

    private SingleTonOne() {}

    public static SingleTonOne getInstance() {
        return singleTonOne;
    }
}

4. 이중 검사 자물쇠
게으름뱅이 식 동기 잠 금 으로 스 레 드 안전 문 제 를 해결 할 수 있 지만, 우 리 는 하나의 대상 을 얻 을 때 매번 스 레 드 동기 잠 금 을 판단 할 필요 가 있 습 니까?만약 에 단일 대상 이 비어 있 지 않 으 면 우 리 는 단일 대상 으로 돌아 가면 됩 니 다. 스 레 드 동기 화 자물쇠 와 구조 단일 대상 을 판단 할 필요 가 없습니다. 이중 검증 자 물 쇠 는 게 으 른 식 동기 화 자 물 쇠 를 바탕 으로 한 층 의 단일 대상 이 비어 있 는 지 판단 하여 스 레 드 동기 화 자 물 쇠 를 판단 하 는 횟수 를 줄 이 고 효율 을 높 입 니 다. 코드 는 다음 과 같 습 니 다.
public class SingleTonTwo {
    private static SingleTonTwo singleTonTwo = null;

    private SingleTonTwo() {}

    public static SingleTonTwo getInstance() {
        if (singleTonTwo == null) { //          ,          getInstance  ,              ,            
            singleTonTwo = new SingleTonTwo();
        }
        return singleTonTwo;
    }
}

장점: 게 으 른 로드, 스 레 드 안전, 효율 높 음
단점: 코드 복잡
5. 정적 내부 클래스 이용
자바 의 정적 내부 클래스 의 로 딩 은 이 정적 내부 클래스 를 사용 할 때 만 불 러 옵 니 다. 또한 정적 내부 클래스 를 불 러 오 는 것 은 스 레 드 가 안전 합 니 다. 우 리 는 이러한 특성 을 이용 하여 단일 모드 를 정의 할 수 있 습 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
장점: 간단 하고 게 으 른 로드, 스 레 드 안전 실현
단점: 정적 내부 클래스 가 추가 되 었 습 니 다. apk 파일 이 증가 합 니 다.
6. 매 거
public class SingleTonThree {
    private static SingleTonThree singleTonThree = null;

    private SingleTonThree() {

    }

    public static SingleTonThree getInstance() {
        synchronized(SingleTonThree.class) { //        ,            
            if (singleTonThree == null) {
                singleTonThree = new SingleTonThree();
            }
        }
        return singleTonThree;
    }
}

장점: 스 레 드 안전, 직렬 화 와 반사 문 제 는 걱정 하지 마 세 요.
단점: 매 거 진 메모리 가 많 습 니 다. 왜 매 거 진 메모리 가 많은 지 참고 하 시기 바 랍 니 다.https://blog.csdn.net/xiao_nian/article/details/80002101
3. 총화
단일 모델 의 정 의 는 굶 주 린 사람 식, 게 으 른 사람 식, 게 으 른 사람 식 동기 화 자물쇠, 이중 검사 자물쇠, 정적 내부 류, 매 거 진 이 몇 가지 정의 방식 이 있 는데 모든 방식 은 그들의 장단 점 이 있 기 때문에 우 리 는 자신의 수요 에 따라 자신의 정의 방식 을 선택 할 수 있다.

좋은 웹페이지 즐겨찾기