天天看點

單例模式(Singleton Pattern)

23種設計模式之單例模式(Singleton Pattern)

23種設計模式之代理模式(Proxy Pattern)

23種設計模式之擴充卡模式(Adapter Pattern)

23種設計模式之工廠模式(Factory Pattern)

23種設計模式之抽象工廠模式(Abstract Factory Pattern)

23種設計模式之裝飾器模式(Decorator Pattern)

--------------------------------------------------------------------------------------------------------------------------

1. 單例模式定義

2. 單例模式代碼實作

3. 單例模式優缺點

4. 單例模式應用舉例

      單例模式是 Java 中最簡單的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。

      目的:保證一個類隻能有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體,避免頻繁建立對象,節約記憶體。

      主要解決:一個全局使用的類頻繁地建立與銷毀。

      何時使用:當想控制執行個體數目,節省系統資源時。

      如何解決:判斷系統是否已經持有這個單例,如果有則傳回,如果沒有則建立。

      關鍵代碼:構造函數私有化。

       餓漢式:在類加載時就完成了初始化,避免了多線程同步問題,擷取對象的速度快。但因為類加載時就被執行個體化了,導緻類加載比較慢,而且如果該執行個體沒有被使用,記憶體空間就白白浪費了。

       懶漢式:在類加載時不初始化,等到第一次被使用時才初始化

Demo1:

       簡單的懶漢式寫法,存在多線程安全問題。如果多個線程同時通路,有可能出現對象多次執行個體化。

       同步懶漢式:對getInstance()方法加synchronize,保證了同一時刻隻能有一個線程通路并獲得執行個體。缺點:synchronized修飾整個方法,每個線程通路都要進行同步,而這個方法隻執行一次執行個體化代碼就夠了,每次都同步方法顯然效率低下。

       雙重檢查懶漢式:為什麼要做兩次判斷?當對象還沒執行個體化時,兩個線程A和B同時通路靜态方法并同時運作到第一個if判斷語句,這時線程A先進入同步代碼塊中執行個體化對象,結束之後線程B也進入同步代碼塊,如果沒有第二個if判斷語句,那麼線程B也同樣會執行執行個體化對象的操作。

       靜态内部類懶漢式:這種靜态内部類方式在Singleton類被裝載時并不會立即執行個體化,而是在需要執行個體化時,調用getInstance方法,才會裝載SingletonInstance類,進而完成對象的執行個體化。同時,因為類的靜态屬性隻會在第一次加載類的時候初始化,也就保證了SingletonInstance中的對象隻會被執行個體化一次,并且這個過程也是線程安全的。

單例模式優點:

       1、單例類隻有一個執行個體,節省了記憶體資源,對于一些需要頻繁建立銷毀的對象,進而提高系統性能。

       2、單例模式可以在系統設定全局的通路點,優化和共享資料。

       3、避免對資源的多重占用。

單例模式缺點:

       1、沒有接口,不能繼承,與單一職責原則沖突(一個類應該隻關心内部邏輯,而不關心外面怎麼樣來執行個體化),導緻擴充的話除了修改代碼基本上沒有其他途徑。

       1、要求生産唯一序列号。

       2、WEB 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先緩存起來。

       3、建立的一個對象需要消耗的資源過多,比如 I/O 與資料庫的連接配接等。

借鑒博文:javascript:void(0)

                  https://www.runoob.com/design-pattern/singleton-pattern.html

繼續閱讀