디자인 모드 - 단일 모드 (singleton pattern) 상세 설명

4282 단어 DesignPattern
단일 모드 (singleton pattern) 상세 설명
 
본문 주소: http://blog.csdn.net/caroline_wendy/article/details/28595349
 
단일 모드 (singleton pattern): 하나의 인 스 턴 스 만 있 는 지 확인 하고 전체 액세스 점 을 제공 합 니 다.
단가 모델 은 세 가지 부분 을 포함한다. 사유 구조 기, 정적 변수, 정적 방법 이다.
 
구체 적 인 방법:
1. 표준 단일 모드:
 
/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private static Singleton uniqueInstance; //    
	
	private Singleton() {} //      
	
	public static Singleton getInstance() { //    
		if (uniqueInstance == null)
			uniqueInstance = new Singleton();
		return uniqueInstance;
	}

}

2. 다 중 스 레 드 를 고려 하 는 세 가지 방법:
 
동기 화 (synchronized) 방법, "synchronized" 추가, 성능 이 떨 어 질 수 있 습 니 다. 예 시 를 호출 할 때마다 동기 화 되 어야 하지만 사용 은 간단 합 니 다.
 
/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private static Singleton uniqueInstance; //    
	
	private Singleton() {} //      
	
	public static synchronized Singleton getInstance() { //    
		if (uniqueInstance == null)
			uniqueInstance = new Singleton();
		return uniqueInstance;
	}

}

 
 
 
 
 
절박 (eagerly) 방법 은 시작 할 때 인 스 턴 스 를 만 들 고 필요 하지 않 을 때 인 스 턴 스 공간 을 차지 합 니 다. 즉, 공간 을 너무 오래 차지 합 니 다.
 
/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private static Singleton uniqueInstance = new Singleton(); //    
	
	private Singleton() {} //      
	
	public static synchronized Singleton getInstance() { //    
		//if (uniqueInstance == null)
			//uniqueInstance = new Singleton();
		return uniqueInstance;
	}

}

이중 검사 잠 금 (double - checked locking) 방법 은 "volatile" 과 "synchronized (Singleton. class)" 를 사용 하여 시간 소 모 를 줄 이 고 자바 1.4 이상 버 전에 적용 합 니 다.
 
 
/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private volatile static Singleton uniqueInstance; //    
	
	private Singleton() {} //      
	
	public static synchronized Singleton getInstance() { //    
		if (uniqueInstance == null) {
			synchronized (Singleton.class) {
				if (uniqueInstance == null)
					uniqueInstance = new Singleton();
			}
		}
		return uniqueInstance;
	}

}

3. 단일 모드 를 사용 하 는 예:
 
코드:
 
/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class ChocolateBoiler { //     
	private boolean empty;
	private boolean boiled;
	
	public static ChocolateBoiler uniqueInstance; //    
	
	private ChocolateBoiler() { //      
		empty = true;
		boiled = false;
	}
	
	public static ChocolateBoiler getInstance() { //    
		if (uniqueInstance == null) 
			uniqueInstance = new ChocolateBoiler();
		return uniqueInstance;
	}
	
	public void fill() { //  
		if (isEmpty()) {
			empty = false;
			boiled = false;
		}
	}
	
	public void drain() { //  
		if (!isEmpty() && isBoiled())
			empty = true;
	}
	
	public void boil() { // 
		if (!isEmpty() && !isBoiled()) {
			boiled = true;
		}
	}
	
	public boolean isEmpty() {
		return empty;
	}
	
	public boolean isBoiled() {
		return boiled;
	}

}

 
4. 매 거 진 단일 (enum singleton) 모드 도 스 레 드 안전 을 확보 할 수 있 습 니 다.
 
코드:
 
/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class EnumSingleton {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		eSingleton d1 = eSingleton.INSTANCE;
		d1.setName("Spike");
		
		eSingleton d2 = eSingleton.INSTANCE;
		d2.setName("Caroline");
		
		System.out.println(d1);
		System.out.println(d2);
		
		System.out.println(d1 == d2);
	}

}

enum eSingleton {
	
	INSTANCE;
	
	private String name;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "[" + name + "]";
	}
}

출력:
 
 
[Caroline]
[Caroline]
true

 
 
 
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기