摘要:各種寫法單例的寫法有很多,相信大家都知道的應該是餓漢與飽漢式。寫在最后本打字員覺得,單例模式實在是所有模式中用情最專一的模式了,知道為什么嗎,因為使用了它以后,你一生只能而且只會擁有一個對象了
簡單說幾句
本文首發公眾號【一名打字員】
說起這個單例,簡直是人名中的張偉、代碼圈中的八阿哥,已經被廣泛的所使用。但是你真的會單例么?來我們拭目以待吧。
各種寫法單例的寫法有很多,相信大家都知道的應該是餓漢與飽漢式。
餓漢式
public class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } }
所謂餓漢式,就是餓了太久了,上來就開始吃。這種方式在這個類加載的時候就創建了實例,方便我們可以在其他地方直接使用,但是缺點就是不管有沒有用到這個類的方法,他都會創建,會造成不必要的開銷。
飽漢式
public class Singleton{ private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(null == instance){ instance = new Singleton(); } return instance; } }
顯而易見,飽漢式與餓漢式剛好對立,一個餓太久了,上來就吃,一個沒吃就吃、吃飽了就不吃了。在需要獲取實例的時候才回去創建新的對象,在我們使用頻率比較少的時候以及創建一次實例需要消耗比較大的資源時,推薦使用這種方式。
雙重檢查鎖
但是,與餓漢式不會存在多線程創建多個實例不同的是,飽漢式無法保證線程安全,可能會導致多個線程使用創建多個實例,機智的我們肯定會加上一個同步鎖,但是這樣效率肯定就不行了。因為每次調用生成實例的話都需要在同步那里進行等待,所以,就出現了雙重檢查鎖。
public class Singleton{ private static volatile Singleton singleton = null; private Singleton(){} public static Singleton getInstance(){ if(singleton == null){ synchronized (Singleton.class){ if(singleton == null){ singleton = new Singleton(); } } } return singleton; } }
靜態內部類
先貼上代碼:
public class Singleton { private static class Holder { private static Singleton singleton = new Singleton(); } private Singleton(){} public static Singleton getInstance(){ return Holder.singleton; } }
這樣的方法,既保證了線程的安全,也能按需加載,貌似看起來是最優的方法了。
枚舉
相信很多打字員都應該知道還有一種很優雅的寫法,就是枚舉。
public enum Singleton { INSTANCE; private String name; public String getName(){ return name; } public void setName(String name){ this.name = name; } }
這種方法本打字員是在Effective Java中了解到了,之前還真的沒了解過,而且在書中推薦的就是這種寫法,原因是Prevent reflection forcibly call the constructor,意思差不多就是防止反射強行調用構造器吧。
寫在最后本打字員覺得,單例模式實在是所有模式中用情最專一的模式了,知道為什么嗎,因為使用了它以后,你一生只能而且只會擁有一個對象了!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68753.html
摘要:總結單例是運用頻率很高的模式,因為客戶端沒有高并發的情況,選擇哪種方式并不會有太大的影響,出于效率考慮,推薦使用和靜態內部類實現單例模式。 單例模式介紹 單例模式是應用最廣的模式之一,也可能是很多人唯一會使用的設計模式。在應用單例模式時,單例對象的類必須保證只用一個實例存在。許多時候整個系統只需要一個全局對象,這樣有利于我么能協調整個系統整體的行為。 單例模式的使用場景 確保某個類有且...
摘要:不符合設計模式中的單一職責的概念。引入代理實現單例模式引入代理實現單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現的單例模式都混入了傳統面向對象語言的特點。 聲明:這個系列為閱讀《JavaScript設計模式與開發實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統面向對...
摘要:如果需要防范這種攻擊,請修改構造函數,使其在被要求創建第二個實例時拋出異常。單例模式與單一職責原則有沖突。源碼地址參考文獻設計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...
摘要:在設計模式一書中,將單例模式稱作單件模式。通過關鍵字,來保證不會同時有兩個線程進入該方法的實例對象改善多線程問題為了符合大多數程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設計模式》一書中,將單例模式稱作單件模式。這里為了適應大環境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個類只有一個實例,...
閱讀 4167·2022-09-16 13:49
閱讀 1407·2021-11-22 15:12
閱讀 1529·2021-09-09 09:33
閱讀 1047·2019-08-30 13:15
閱讀 1732·2019-08-29 15:30
閱讀 665·2019-08-27 10:52
閱讀 2649·2019-08-26 17:41
閱讀 1904·2019-08-26 12:11