안 드 로 이 드 개발 디자인 모델 의 단일 모델
단일 모델 은 디자인 모델 에서 가장 흔히 볼 수 있 고 가장 간단 한 디자인 모델 로 프로그램 에 하나의 인 스 턴 스 만 존재 하고 전체적인 방문 을 확보 했다.예 를 들 어 안 드 로 이 드 의 실제 앱 개발 에 사용 되 는 계 정 정보 대상 관리, 데이터베이스 대상 (SQLiteOpenHelper) 등 은 모두 단일 모델 을 사용한다.다음은 몇 가지 예 를 들 어 우리 가 개발 과정 에서 단일 모델 을 응용 할 때 주의해 야 할 점 을 분석한다.
1. 역할 단일 예 모드 (Singleton): 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
2. 적용 장면
1. 응용 프로그램 에서 인 스 턴 스 대상 이 자주 방문 해 야 합 니 다.
2. 응용 프로그램 에서 시작 할 때마다 하나의 인 스 턴 스 만 존재 합 니 다.예 를 들 어 계 정 시스템, 데이터베이스 시스템.
3. 자주 사용 하 는 사용 방식
(1) 게으름뱅이 식
이것 은 개발 과정 에서 쉽게 쓸 수 있 는 방식 으로 다음 과 같다.
[java] view plain copy print ?
public class Singleton {
/* 개인 정적 인 스 턴 스 를 가지 고 있 습 니 다. 인용 되 는 것 을 방지 합 니 다. 이 곳 에 값 을 null 로 할당 하 는 것 은 로드 지연 을 실현 하 는 것 입 니 다. */
private Singleton() {
public static Singleton getInstance() {
instance = new Singleton();
return instance;
}
public class Singleton {
/* , , null, */
private static Singleton instance = null;
/* , */
private Singleton() {
}
/* 1: , , */
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
호출:[java] view plain copy print ?
Singleton.getInstance().method();
Singleton.getInstance().method();
장점: 로 딩 지연 (필요 할 때 만 로 딩)단점: 스 레 드 가 안전 하지 않 습 니 다. 다 중 스 레 드 에서 동기 화 되 지 않 는 상황 이 발생 하기 쉽 습 니 다. 예 를 들 어 데이터베이스 대상 이 자주 읽 기와 쓰기 작업 을 할 때.
(2) 동기 화 자물쇠 추가
스 레 드 가 안전 하지 않 은 이상 동기 화 자 물 쇠 를 추가 합 니 다. 하나의 덧셈 은 다음 과 같 습 니 다.
[java] view plain copy print ?
/ * 2. 게으름뱅이 변종, 스 레 드 안전 문제 해결 * * /
if (instance == null) {
}
}
/*2. , **/
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
더 일반적인 문법 은 이렇다[java] view plain copy print ?
/ * synchronized 를 추가 하지만 인 스 턴 스 를 호출 할 때마다 불 러 옵 니 다 * * /
synchronized (Singleton.class) {
instance = new Singleton();
}
}
/* synchronized, **/
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
호출:[java] view plain copy print ?
Singleton.getInstance().method();
Singleton.getInstance().method();
장점: 라인 이 안전 하지 않 은 문 제 를 해결 했다.단점: 효율 이 낮 아 호출 할 때마다 동기 화 잠 금 을 판단 해 야 합 니 다.
보충: 안 드 로 이 드 소스 코드 에서 사용 하 는 이 방법 은 InputMethodManager, Accessibility Manager 등 이 있 습 니 다.
(3) 이중 검사 자물쇠
최적화 (2) 에서 매번 인 스 턴 스 를 호출 할 때마다 동기 화 잠 금 문 제 를 판단 해 야 하기 때문에 많은 사람들 이 아래 의 이중 판단 검증 방법 을 사용한다.
[java] view plain copy print ?
/ * 3. 이중 잠 금: 처음 초기 화 할 때 만 동기 잠 금 추가 * /
if (instance == null) {
if (instance == null) {
}
}
}
/*3. : */
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
이런 방법 은 상기 효율 적 인 문 제 를 완벽 하 게 해결 한 것 같다. 병발 량 이 많 지 않 고 안전성 이 높 지 않 은 상황 에서 완벽 하 게 운행 할 수 있 을 지도 모 르 지만 이런 방법 도 불행 한 점 이 있다. 문 제 는 바로 이 말 에 나타난다.[java] view plain copy print ?
instance = new Singleton();
instance = new Singleton();
JVM 컴 파일 과정 에서 명령 정렬 의 최적화 과정 이 나타 날 수 있 습 니 다. 이 로 인해 인 스 턴 스 가 실제로 초기 화 되 지 않 았 을 때 메모리 공간 이 분 배 될 수 있 습 니 다. 즉, instance! = null 이지 만 초기 화 되 지 않 은 경우 가 발생 합 니 다. 그러면 되 돌아 갈 수 있 습 니 다. instance 가 완전 하지 않 음 (참고 가능:http://www.360doc.com/content/11/0810/12/1542811_139352888.shtml)。
호출:
[java] view plain copy print ?
Singleton.getInstance().method();
Singleton.getInstance().method();
장점: 병발 량 이 많 지 않 고 안전성 이 높 지 않 은 상황 에서 단일 모드 를 완벽 하 게 실행 할 수 있 습 니 다.단점: 서로 다른 플랫폼 의 컴 파일 과정 에서 심각 한 안전 위험 이 존재 할 수 있 습 니 다.
추가: 안 드 로 이 드 이미지 오픈 소스 프로젝트 안 드 로 이 드 - 유 니 버 설 - 이미지 - 로 더 (https://github.com/nostra13/Android-Universal-Image-Loader) 에서 사용 하 는 것 은 이런 방식 이다.
(4) 내부 류 의 실현
내부 클래스 는 좋 은 실현 방식 이 므 로 추천 할 수 있 습 니 다.
[java] view plain copy print ?
public class SingletonInner {
/**
* 로드 지연, 메모리 비용 감소
* @author xuzhaohu
*/
private static SingletonInner instance = new SingletonInner();
* 개인 구조 함수
private SingletonInner() {
}
public static SingletonInner getInstance() {
}
protected void method() {
}
public class SingletonInner {
/**
*
* ,
*
* @author xuzhaohu
*
*/
private static class SingletonHolder {
private static SingletonInner instance = new SingletonInner();
}
/**
*
*/
private SingletonInner() {
}
public static SingletonInner getInstance() {
return SingletonHolder.instance;
}
protected void method() {
System.out.println("SingletonInner");
}
}
호출:
[java] view plain copy print ?
SingletonInner.getInstance().method();
SingletonInner.getInstance().method();
장점: 로 딩 지연, 스 레 드 안전 (자바 에서 class 로 딩 시 서로 배척 하 는), 메모리 소모 도 감소 합 니 다.(5) 매 거 진 방법
이것 은 인터넷 에서 많은 사람들 이 추천 하 는 방법 이지 만 널리 사용 되 지 않 는 것 같 으 니 한번 해 보 세 요.
[java] view plain copy print ?
/**
* @author xuzhaohu
*/
/**
* 2. 직렬 화 체 제 를 무상 으로 제공한다.
*/
instance;
private String others;
SingletonEnum() {
}
public void method() {
}
public String getOthers() {
}
public void setOthers(String others) {
}
/**
* @function:
* @author xuzhaohu
*
*/
public enum SingletonEnum {
/**
* 1. Java1.5 ;
* 2. ;
* 3. , ;
*/
instance;
private String others;
SingletonEnum() {
}
public void method() {
System.out.println("SingletonEnum");
}
public String getOthers() {
return others;
}
public void setOthers(String others) {
this.others = others;
}
}
호출:
[java] view plain copy print ?
SingletonEnum.instance.method();
SingletonEnum.instance.method();
장단 점: 예 를 들 어 코드 에 주석 이 있 습 니 다.위 에 서 는 주로 단일 모델 5 가지 생 성 방법 을 설명 하 였 으 며, 여러분 은 그 장단 점 에 따라 개인 실제 프로젝트 에서 사용 할 수 있 습 니 다. 벽돌 을 던 져 옥 을 끌 어 올 리 는 것 에 속 하 므 로 의견 을 많이 제시 하 시기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.