單例模式的本質:控制實例數目
單例模式的定義:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
懶漢式:
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即可。
懶漢式方案也體現了延遲加載的思想。儘可能的節省資源。
同時,懶漢式方案也體現了緩存的思想,簡單將就是,當某些資源或者數據被頻繁地使用,而這些資源或者數據存儲在系統外部,比如數據庫、硬盤文件等,那麼每次操作這些數據的時候都得從數據庫或者硬盤上去獲取,速度會很慢,將造成性能問題。
一個簡單的解決辦法就是:把這些數據緩存到內存裏面,每次操作的時候,先到內存裏面找,看有沒有這些數據,如果有,就直接使用,如果沒有就獲取它,並設置到緩存中,下一次訪問的時候就可以直接從內存中獲取了,從而節省大量的時間。當然,緩存是一種典型的空間換時間的方案。
單例模式的本質:控制實例數目。