1. 程式人生 > 其它 >【軟體設計模式】單例模式

【軟體設計模式】單例模式

單例模式

前言

​ 一句話總結:所謂的單例模式,就是設計一個類,它在整個程式中只能有一個該類的例項存在,這就是單例模式。

​ 就比如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