디자인 모델 독서 노트 의 단일 예 모델
과연 그것 은 어떤 것 일 까? 또 몇 가지 가 있 을 까? 또 어떤 장면 에서 사용 되 는 것 일 까?우 리 는 먼저 그의 사용 장면 을 살 펴 보 자. 위 에서 말 한 바 와 같이 이것 은 하나의 유형 이 있 고 하나의 인 스 턴 스 대상 만 확보 하 는 것 이다. 여러 대상 이 너무 많은 자원 을 소모 하거나 특정한 대상 이 있어 야 하고 하나의 장면 만 있어 야 한다. 예 를 들 어 io 나 데이터 베 이 스 를 방문 하 는 등 비교적 소 모 된 대상 이다.
캐릭터 소개: (1) 클 라 이언 트 - 고 층 클 라 이언 트
(2) SingLecton - - 단일 클래스 가 단일 모드 를 실현 하 는 관건 점: 1. 구조 함 수 는 대외 적 으로 개방 되 지 않 고 private 로 수식 한다. 2. 하나의 정적 방법 이나 매 거 진 을 통 해 대상 을 되 돌려 준다. 3. 단일 대상 이 있 고 하나 밖 에 없다 는 것 을 확보한다. 특히 다 중 스 레 드 상황 에서 4. 단일 대상 이 반 직렬 화 에서 대상 을 재 구성 하지 않도록 확보한다.단일 클래스 의 구조 함수 사유 화 를 통 해 클 라 이언 트 는 new 형식 으로 단일 클래스 의 대상 을 수 동 으로 구성 할 수 없고 단일 대상 이 노출 된 정적 방법 으로 단일 대상 의 유일한 대상 을 얻 을 수 있 으 며 이 유일한 대상 을 얻 을 때 도 스 레 드 의 안전 을 확보 해 야 한다. 즉, 다 중 스 레 드 환경 에서 도 구조의 단일 대상 이 있 고 하나 밖 에 없다 는 것 을 확보 해 야 한다.이것 도 단일 모델 에서 실현 하기 가 비교적 어 려 운 부분 이다.다음은 코드 로 몇 가지 단일 모델 의 표현 형식 을 살 펴 보 자.1. 굶 주 린 남자 모드
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
굶 주 린 모드 는 대상 구조 함 수 를 민영화 합 니 다. new 를 통 해 가 져 올 수 없습니다. 우 리 는 대상 을 정적 으로 설정 하고 성명 할 때 초기 화 합 니 다.정적 방법 으로 만 얻 을 수 있 고 대상 의 유일 성 을 확보 할 수 있 습 니 다.2. 게으름뱅이 모드 (라인 이 안전 하지 않 아 추천 하지 않 음)
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
이 모드 는 키워드 synchronized 설명 을 추가 하여 동기 화 방법 으로 다 중 스 레 드 모드 에서 대상 의 유일한 수단 을 확보 합 니 다.문 제 는 첫 번 째 호출 이 초기 화 된 후에 도 getInstance () 방법 을 호출 할 때마다 동기 화 되 고 불필요 한 자원 을 소모 하 는 것 이다. 일반적으로 게으름뱅이 모델 을 정리 하 는 것 을 추천 하지 않 는 다. 장점 은 호출 될 때 만 실례 화 되 고 어느 정도 에 자원 을 절약 하 는 것 이다. 단점 은 첫 번 째 호출 로 딩 이 제때에 정례 화 되 고 반응 이 느 리 며 호출 할 때마다 동기 화 되 는 것 이다.불필요 한 동기 화 지출 을 늘리다.3. DCL 모드
public class Singleton {
private static Singleton instance=null;
private Singleton() {
}
public static Singleton getInstance(){
if (instance==null){
synchronized (Singleton.class){
if (instance==null){
instance=new Singleton();
}
}
}
return instance;
}
프로그램의 하 이 라 이 트 는 getInstance 방법 에 있 습 니 다. 이 방법 에서 인 스 턴 스 를 두 번 째 로 비 우 는 것 입 니 다. 첫 번 째 는 불필요 한 동기 화 를 피하 기 위해 서 입 니 다. 두 번 째 로 비 우 는 것 은 null 의 상황 에서 인 스 턴 스 를 만 들 기 위해 서 입 니 다.자원 소모, 불필요 한 동기 화, 라인 안전 문 제 를 해결 했다.더 자세 한 설명: 인 스 턴 스 = new Singleton () 에 스 레 드 A 가 실 행 될 때 크게 세 가지 일 을 했 습 니 다. Singleton 인 스 턴 스 에 메모 리 를 할당 하고 구조 함 수 를 호출 하 며 필드 를 초기 화하 여 인 스 턴 스 대상 을 할당 하 는 메모리 공간 (이때 Singlecton 은 null 이 아 닙 니 다)
DCL 의 장점: 자원 이 용 률 이 높 고 효율 이 높다 는 단점: 첫 번 째 로 딩 반응 이 느 리 고 자바 메모리 모델 의 원인 으로 인해 가끔 실패 할 수 있 으 며 높 은 병행 환경 에서 어느 정도 결함 이 있다 (확률 이 적다).DCL 은 일례 로 가장 많이 사용 되 는 패턴 이다.4. 정적 내부 모드
public class Singleton {
private Singleton() {
}
public static Singleton getInstance(){
return SingletonHoulder.instance;
}
public static class SingletonHoulder{
private static final Singleton instance = new Singleton();
}
정적 내부 방식 정적 내부 모드 는 dcl 모드 가 특정한 상황 에서 효력 을 잃 는 것 을 방지 하기 위해 발생 한 것 입 니 다.5. 매 거 모드
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
이러한 방식 은 Effective Java 작가 Josh Bloch 가 제창 하 는 방식 으로 다 중 스 레 드 동기 화 문 제 를 피 할 수 있 을 뿐만 아니 라 반 직렬 화 를 방지 하여 새로운 대상 을 다시 만 들 수 있다.6. 용기 모드
public class SinglectonManager {
private static Map objectMap = new HashMap();
private SinglectonManager(){
}
private static void resgisterService(String key,Object instance){
if (!objectMap.containsKey(key)){
objectMap.put(key,instance);
}
}
public static Object getService(String key){
return objectMap.get(key);
}
}
프로그램 초기 에 여러 가지 단일 유형 을 하나의 통 일 된 관리 클래스 에 주입 하고 사용 할 때 키 에 따라 대응 하 는 대상 을 얻는다. 이런 방식 은 우리 로 하여 금 여러 가지 유형 을 관리 하 게 하고 획득 할 때 통 일 된 인 터 페 이 스 를 통 해 얻 을 수 있 으 며 사용 원 가 를 낮 출 수 있 으 며 구체 적 인 실현 도 숨 기 고 결합 을 낮 출 수 있다.
요약: 장점: 1. 단일 모델 은 메모리 에 하나의 인 스 턴 스 만 있 고 메모리 의 지출 을 줄 였 습 니 다. 특히 한 대상 이 자주 만 들 고 소각 할 때 성능 이 최적화 되 지 못 하 는 장점 이 가장 뚜렷 합 니 다. 2. 시스템 성능 소 비 를 줄 이 고 한 대상 이 비교적 많은 자원 이 필요 할 때 설정 을 읽 고 의존 대상 을 만 들 때 하나의 사례 를 직접 만 들 수 있 습 니 다.그리고 영구적 으로 메모리 에 머 무 르 는 방식 으로 해결 합 니 다.3. 자원 파일 에 대한 다 중 점용 을 피한다. 4. 자원 접근 최적화 와 공유
단점: 1. 인터페이스 가 없 으 면 확장 이 어렵 습 니 다. 2. Context 를 가지 고 있 으 면 메모리 유출 이 발생 하기 쉽 습 니 다 (applicationContext 가 좋 습 니 다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.