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