디자인 모드 2: 단일 예
1. 정의
단일 예 (Singleton) 모드 의 정의: 하나의 인 스 턴 스 만 있 고 이 인 스 턴 스 를 자체 적 으로 만 들 수 있 는 모델 을 말 합 니 다.
2. 단일 모델 의 장점 과 단점
단일 모드 의 장점:
단일 모드 의 단점:
3. 실현 방식
단일 모드 는 8 가지 방식 이 있 습 니 다.
/**
* 、 ( )
* : 。 ;
* : Lazy Loading
*/
public class Singleton1 {
// 2.
private final static Singleton1 instance = new Singleton1();
// 1.
private Singleton1(){
}
// 3. ,
public Singleton1 getInstance(){
return instance;
}
}
3.2 굶 주 린 사람 식 (정적 코드 블록)
/**
* 、 ( )
* : 。 ;
* : Lazy Loading
*/
public class Singleton2 {
// 1.
private Singleton2(){
}
// 2.
private final static Singleton2 instance;
//3. ,
static {
instance = new Singleton2();
}
// 4. ,
public Singleton2 getInstance(){
return instance;
}
}
3.3 게으름뱅이 식 (라인 이 안전 하지 않 음)
/**
* 、 ( )
* : Lazy Loading ;
* : , if (singleton == null) , ,
* , 。
*/
public class Singleton3 {
// 1.
private Singleton3() {
}
// 2.
private static Singleton3 instance;
//3. , , instance
public static Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
3.4 게으름뱅이 식 (스 레 드 안전, 동기 화 방법)
/**
* 4 ( , )
* : ;
* : , , getInstance()
*/
public class Singleton4 {
// 1.
private Singleton4() {
}
// 2.
private static Singleton4 instance;
// 3. , , instance
// 4. ,
public static synchronized Singleton4 getInstance() {
if (instance == null) {
instance = new Singleton4();
}
return instance;
}
}
3.5 게으름뱅이 식 (스 레 드 안전, 동기 코드 블록)
/**
* 5 ( , )
* : ;
* : , , getInstance()
*/
public class Singleton5 {
// 1.
private Singleton5() {
}
// 2.
private static Singleton5 instance;
// 3. , , instance
// 4. , ,
public static Singleton5 getInstance() {
if (instance == null) {
synchronized (Singleton5.class) {
instance = new Singleton5();
}
}
return instance;
}
}
3.6 이중 검사
/**
* 6
* : ; ; ;
* :#
*
*/
public class Singleton6 {
// 1.
private Singleton6() {
}
// 2. volatile
private static volatile Singleton6 instance;
// 3. , , ,
// 4. ,
public static Singleton6 getInstance() {
if (instance == null) {
synchronized (Singleton6.class) {
if(instance == null){
instance = new Singleton6();
}
}
}
return instance;
}
}
3.7 정적 내부 클래스
/**
* 7
* : ;
* :#
*
*/
public class Singleton7 {
// 1.
private Singleton7() {
}
// 2.
private static Singleton7 instance;
// 3. ,
private static class SingletonInstance {
private static final Singleton7 INSTANCE = new Singleton7();
}
// 4. , SingletonInstance.INSTANCE
public static Singleton7 getInstance() {
return SingletonInstance.INSTANCE;
}
}
3.8 매 거
/**
* 8
* : JDK1.5 。 , ;
* :#
* Effective Java Josh Bloch
*/
public enum Singleton8 {
INSTANCE; //
public void sayOK() {
System.out.println("ok~");
}
}
public class Singleton8Test {
public static void main(String[] args) {
Singleton8 instance = Singleton8.INSTANCE;
Singleton8 instance2 = Singleton8.INSTANCE;
instance.sayOK();
instance2.sayOK();
System.out.println(instance == instance2);
}
}
4. 단일 모드 응용 장면
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.