【軟體設計模式】單例模式
單例模式
前言
一句話總結:所謂的單例模式,就是設計一個類,它在整個程式中只能有一個該類的例項存在,這就是單例模式。
就比如PPT視窗可以開啟多個,工作管理員只能開一個。我們希望在Window執行時最多隻能有一個工作管理員。
意圖:確保一個類只能有一個例項,且提供對該例項的全域性訪問。
問題:幾個不同的客戶物件需要引用同一個物件,而且希望確保這種型別的物件數目不超過一個。
public class MyClass { private static MyClass uniqueInstance; // 其他成員變數宣告 private MyClass() {… } //方法設定為static,它不依賴自身實體物件。 public static MyClass getInstance() { if (uniqueInstance == null) uniqueInstance = new MyClass(); return uniqueInstance; } // 其他成員方法宣告 }
以上程式碼給予了我們另外一種例項化一個物件的方法(不通過new,而是通過類的靜態方法getInstance獲得唯一單例)
單例模式一般有兩種實現模式
餓漢模式:像一個餓漢一樣,不管需不需要用到例項都要去建立例項,即在類產生的時候就建立好例項,這是一種空間換時間的做法。作為一個餓漢而言,體現了它的本質——“我全都要”。
懶漢模式:像一個懶漢一樣,需要用到建立例項了程式再去建立例項,不需要建立例項程式就“懶得”去建立例項,這是一種時間換空間的做法,這體現了“懶漢的本性”。
餓漢模式
餓漢模式的物件在類產生時候就建立了,一直到程式結束才會去釋放。即作為一個單例類例項,它的生存週期和我們的程式一樣長。因此該例項物件肯定需要使用static來修飾,因為類內部的static成員是不屬於每個物件的,而是屬於整個類的。在載入類的時候,我們的例項物件就產生了。所以對於餓漢模式而言,是執行緒安全的,因為線上程建立之前例項已經被建立好了
//類EagerSingleton在載入時就馬上將自己例項化。 //可以解決多執行緒的問題 public class EagerSingleton { private static final EagerSingleton uniqueInstance = new EagerSingleton(); //建構函式為私有,也就是該類無法在其他類中例項化 private EagerSingleton() {…} public static EagerSingleton getInstance() { return uniqueInstance; } }
懶漢模式
//類LazySingleton只在第一次被引用時才例項化,靜態載入該類並不會將他自己例項化。
public class LazySingleton {
private static LazySingleton uniqueInstance;
// 其他成員變數宣告
private LazySingleton() {…}
public static LazySingleton getInstance() {
if (uniqueInstance == null)
uniqueInstance = new LazySingleton();
return uniqueInstance;
}
// 其他成員方法宣告
}
餓漢模式與懶漢模式比較
餓漢式單例類在自己被載入時就將自己例項化。單從資源利用效率角度來講,比懶漢式單例類稍差些。從速度和反應時間角度來講,則比懶漢式單例類稍好些。
懶漢式單例類在例項化時,必須處理好在多個執行緒同時首次引用此類時的訪問限制問題,特別是當單例類作為資源控制器,在例項化時必然涉及資源初始化,而資源初始化很有可能耗費大量時間,這意味著出現多執行緒同時首次引用此類的機率變得較大,需要通過同步化機制進行控制。
參考連線
https://blog.csdn.net/lvyibin890/article/details/81943637
https://blog.csdn.net/u014088294/article/details/50061073
老師的PPT