設計模式8--單例模式(Singleton)

單例模式的本質:控制實例數目

單例模式的定義:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

懶漢式:

public class Singleton {
	//4.定義存儲實例的屬性
	//5.把這個屬性也定義成靜態的
	private static Singleton instance = null;
	//1.似有化構造方法
	private Singleton(){
		
	}
	//2.提供獲取實例的方法
	//3.把獲取實例的方法變成靜態的
	//6.實現控制實例的創建
	//7.把獲取實例的方法變成synchronized的
    public static synchronized Singleton getInstance(){
    	if(instance == null){
    		instance = new Singleton();
    	}
		return instance;
	}
}

餓漢式:

public class Singleton {
	//4.定義一個靜態變量來存儲創建好的類實例
	//直接在這裏創建類實例,只能創建一次
	private static Singleton instance = new Singleton();
	//1.似有化構造方法
	private Singleton(){
		
	}
	//2.提供獲取實例的方法
	//3.把獲取實例的方法變成靜態的
	//5.直接使用已經創建好的實例
    public static Singleton getInstance(){
		return instance;
	}
}

餓漢式方案用到了static的特性,在Java中,static變量只會被初始化一次,就是在類裝載的時候。

而懶漢式存儲實例的屬性也定義成靜態的,僅僅是由於獲取實例的方法是靜態的緣故。

餓漢式方案是線程安全的,因爲虛擬機保證只會裝載一次,在裝載類的時候不會發生併發的。而懶漢式方案也是可以實現線程安全的,只要加上synchronized即可。

懶漢式方案也體現了延遲加載的思想。儘可能的節省資源。

同時,懶漢式方案也體現了緩存的思想,簡單將就是,當某些資源或者數據被頻繁地使用,而這些資源或者數據存儲在系統外部,比如數據庫、硬盤文件等,那麼每次操作這些數據的時候都得從數據庫或者硬盤上去獲取,速度會很慢,將造成性能問題。

一個簡單的解決辦法就是:把這些數據緩存到內存裏面,每次操作的時候,先到內存裏面找,看有沒有這些數據,如果有,就直接使用,如果沒有就獲取它,並設置到緩存中,下一次訪問的時候就可以直接從內存中獲取了,從而節省大量的時間。當然,緩存是一種典型的空間換時間的方案。

單例模式的本質:控制實例數目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章