디자인 모델 꼬치 꼬치 - 단일 모델 (Singleton Pattern)
개술
단일 모델 은 간단 하면 서도 복잡 한 모델 이다.간단하게 그것 이 실현 하고 자 하 는 목 표를 이해 하기 쉽 고 복잡 하 게 라인 의 안전 한 단일 모델 을 쓰 는 것 은 쉽 지 않다.단일 모드 의 핵심 정 의 는 클래스 가 하나의 인 스 턴 스 만 있 는 지 확인 하고 이 인 스 턴 스 를 방문 하 는 전역 접근 점 을 제공 하 는 것 입 니 다 (Ensure a class has only instance, and provide a global point of access to it).
단일 모드 의 실현
단일 모드 의 실현 은 급 한 (Eager) 과 지연 되 는 (Lazy), 스 레 드 안전 (Thread - safe) 과 비 스 레 드 안전 (Non - Thread - safe) 몇 가지 로 나 뉜 다.다음은 자바 가 단일 모델 의 실현 에 대해 소개 한다.
Eager 모드 구현
Eager 모드 의 실현 은 보통 정적 인 단일 필드 에서 설명 할 때 (또는 단일 클래스 의 구조 함수) 이 단일 사례 의 대상 을 만 듭 니 다.이렇게 하면 단일 클래스 가 자바 가상 컴퓨터 에 불 러 올 때 이 단 예 를 실례 화 할 수 있다.
정적 영역 기반 Eager 모드
public class StaticSingleton implements Serializable {
private static StaticSingleton INSTANCE = new StaticSingleton();
private StaticSingleton() {}
public static StaticSingleton getInstance() {
return INSTANCE;
}
/**
*
* @return
*/
private Object readResolve() {
return INSTANCE;
}
}
정적 블록 에 초기 화
public class Singleton {
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
기본 Java Enum 에서 구현 되 는 Eager 모드
자바 매 거 진 모델 이 실 현 된 단 례 는 다음 과 같이 추앙 받 고 있 기 때문이다.
public enum EnumSingleton {
INSTANCE;
private Object singleton;
public void print(String name) {
System.out.println("Hello : " + name);
}
public Object build() {
singleton = new Object();
return singleton;
}
}
class Client {
public static void main(String[] args) {
EnumSingleton.INSTANCE.print("hello");
Object object = EnumSingleton.INSTANCE.build();
}
}
Lazy 모드 구현
Eager 모드 의 실현 은 스 레 드 문 제 를 피 할 수 있 지만 단일 대상 이 불 러 와 야 할 시스템 자원 이 많 을 때 시스템 이 시작 할 때 느 릴 수 있 습 니 다.따라서 이 대상 을 사용 할 때 구조 하 는 방식 이 필요 하 다.단 례 로 이 뤄 지 는 레이 지 모드 다.
비 스 레 드 보안 레이 지 모드
지연 실례 화 방식 을 채택 하면 단일 대상 의 구 조 를 첫 번 째 호출 때 까지 늦 출 수 있다.이 방식 은 비 스 레 드 안전 (Non - Thread - Safe) 임 이 분명 하 다.
public class Singleton {
private static Singleton singleton = null;
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) {
// can be interrupted to other thread
singleton = new Singleton();
}
return singleton;
}
}
안전 한 레이 지 모드
방법 에 자 물 쇠 를 추가 하면 이 단일 모델 이 다 중 스 레 드 환경 에서 의 안전성 을 확보 할 수 있 으 나 성능 은 심각 한 영향 을 받 을 것 이다.단일 대상 이 생 성 되면 대상 의 상호 배척 자 물 쇠 를 동기 화 할 필요 가 없 기 때문이다.
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
정적 내부 클래스 기반 방식
내부 정적 클래스 Singleton Holder 는 Singleton 클래스 가 불 러 올 때 실례 화 되 지 않 으 며, getInstance () 디 스 플레이 에서 호출 될 때 불 러 옵 니 다.따라서 레이 지 로드 도 가능 하 다.
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
DCL 기반 Lazy 모드
DCL (Double Checked Locking) 은 volatile 의 사용 에 맞 춰 이중 검 사 를 하여 스 레 드 안전 과 로드 지연 을 만족 시 킬 수 있 습 니 다.
/** Lazy load thread safe
* Created by zhaoyu on 16-8-31.
*/
public class DoubleCheckedLockingSingleton {
private volatile DoubleCheckedLockingSingleton INSTANCE;
private DoubleCheckedLockingSingleton() {}
public DoubleCheckedLockingSingleton getInstance() {
if (INSTANCE == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (INSTANCE == null) {
INSTANCE = new DoubleCheckedLockingSingleton();
}
}
}
return INSTANCE;
}
}
단일 모드 의 사용 장면
단일 모드 (Singleton Pattern) 는 광범 위 하 게 사용 되 는 모델 로 서 시스템 의 메모리 소 비 를 줄 이 고 시스템 의 성능 을 향상 시 킬 뿐만 아니 라 시스템 자원 에 대한 과도 한 점용 도 피 할 수 있다.단일 모드 를 사용 할 때 는 다 중 스 레 드 환경 에서 사용 할 지 여 부 를 고려 해 야 한다.현재 Enum 기반 구현 은 현재 추천 하 는 단일 구현 방식 이다.한 마디 로 하면 단일 모델 의 사용 은 실제 환경 에서 수요 에 따라 적당 한 실현 방식 을 선택해 야 한다.
참조 참조
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.