天天看點

設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)

文章目錄

  • 建立型--單例模式(Singleton pattern)
    • 懶漢式--線程不安全
    • 餓漢式--線程安全
    • 懶漢式--線程安全
  • 建立型--簡單工廠(Simple Factory)
    • 意圖
    • 類圖
    • 實作

建立型–單例模式(Singleton pattern)

單例設計模式確定一個類隻有一個執行個體,并提供該執行個體的全局通路點。

使用一個私有構造函數、一個私有靜态變量以及一個公有靜态函數來實作。

私有構造函數保證了不能通過構造函數來建立對象執行個體,隻能通過公有靜态函數傳回唯一的私有靜态變量。

設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)

懶漢式–線程不安全

在以下實作中,私有靜态變量

uniqueInstance

被延遲執行個體化,這樣做的好處是如果沒有用到該類,那麼就不會執行個體化

uniqueInstance

,進而節約資源。

這個實作在多線程環境下是不安全的。

設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)

餓漢式–線程安全

線程不安全問題主要是由于**

uniqueInstance

被多次執行個體化**,采取直接執行個體化

uniqueInstance

的方式就不會産生線程不安全問題。但是直接執行個體化的方式也丢失了延遲執行個體化帶來的節約資源的好處。

懶漢式–線程安全

隻需要對

getUniqueInstance()

方法加鎖,那麼在一個時間點隻能有一個線程能夠進入該方法,進而避免了多次被執行個體化

uniqueInstance

的問題。

但是當一個線程進入該方法之後,其他試圖進入該方法的線程都必須等待,是以性能上會有一定的損耗。

public static synchronized Singleton getUniqueInstance() {
    if (uniqueInstance == null) {
        uniqueInstance = new Singleton();
    }
    return uniqueInstance;
}

           

建立型–簡單工廠(Simple Factory)

該模式把執行個體化的操作單獨放到一個類中,這個類就是簡單工廠類,讓簡單工廠類來決定應該用哪個具體子類來執行個體化,這樣做能把客戶類和具體子類的實作解耦,客戶類不再需要知道有哪些子類以及應當執行個體化哪個子類。如果不使用簡單工廠,所有客戶類都要知道所有子類細節。

意圖

在建立一個對象時不向客戶暴露内部細節,并提供一個建立對象的通用接口。

類圖

設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)

實作

設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)

如果在客戶類中存在執行個體化代碼,就需要将代碼放到簡單工廠中。以下簡單工廠實作,他被所有需要進行執行個體化的客戶類調用。

設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)
設計模式--單例模式&簡單工廠建立型–單例模式(Singleton pattern)建立型–簡單工廠(Simple Factory)