1. 程式人生 > >單例的餓漢與懶漢模式

單例的餓漢與懶漢模式

單例模式 一個類只建立一個例項,每次都獲取的同一個物件 單例模式分為餓漢模式和懶漢模式 單例模式的三要素: 1、構造方法私有化 2、靜態屬性指向例項 3、public static 的xx方法要返回例項

餓漢模式

立即載入,無論是否用到這個物件都會載入 無論如何都會建立一個物件 啟動的時間較長,使用的時候較快

public class Hunger {
	/**
	 * 單例模式:一個類只建立一個例項。每次都獲取同一個物件
	 * 餓漢單例模式:無論如何都會建立一個物件
	 */
	
	//私有化構造方法,使得該類無法在外部通過new來例項化
	private Hunger() {
		
	}
	
	//用new來例項化 一個物件
	public static Hunger show = new Hunger();
	
	//public static 來提供給呼叫者new的物件
	public static Hunger getShow() {
		
		return show;
	}
	
}

public class HungerTest {

	public static void main(String[] args) {

		//直接建立物件會報錯
		//Hunger h = new Hunger();
		
		
		//只能通過Hunger中的getShow來獲取物件
		Hunger h1 = Hunger.getShow();
		Hunger h2 = Hunger.getShow();//h1,h2都是同一個物件
		
		System.out.println(h1==h2);
	}

}
//結果為:true

懶漢模式 延遲載入,只有在使用的時候才載入 只有在呼叫方法的時候才建立例項 啟動快,第一次使用的時候慢

public class Lazy {
	/**
	 * 單例模式:一個類只建立一個例項
	 *   懶漢模式:只有在呼叫方法的時候才建立例項
	 */
	
	//私有化建構函式,使它不能通過new來建立例項
	private Lazy() {
		
	}
	
	//準備一個例項化屬性,指向null
	public static Lazy show;
	

	//public static 方法,返回例項物件
	public static Lazy getShow() {
		//判斷例項是否為空,如果為空就建立例項
		if(null == show) {
			show = new Lazy();
		}
		//返回例項指向的物件
		return show;
	}
}
public class LazyTest {

	public static void main(String[] args) {
	
		Lazy l1 = Lazy.getShow();
		Lazy l2 = Lazy.getShow(); //l1,l2都是同一個物件
		
		System.out.println(l1==l2);
	}

}
//結果為:true

當有充分的啟動和初始化的時間時,使用餓漢模式,否則使用懶漢模式