單例模式

1 定義:確保某一個類只有一個實例,而且自行實例化,并且向整個系統(tǒng)提供這個實例,它提供全局的訪問方法。 構(gòu)造方法私有,獲取實例的方法是oublic static,對象域是private static。
私有靜態(tài)成員變量,存儲唯一實例。
私有構(gòu)造函數(shù) 。
公有靜態(tài)成員方法,返回唯一實例 。
2 單例模式有三個要點:一是某個類只能有一個實例,二是必須自行創(chuàng)建這個實例 三是必須自行向整個系統(tǒng)提供這個實例。
3 餓漢式單例類:餓漢式單例類是實現(xiàn)起來最簡單的單例類。由于在定義靜態(tài)變量的時候?qū)嵗瘑卫?,因此在類加載的時候就已經(jīng)創(chuàng)建了單例對象。
4 懶漢式單例類:雙重檢查鎖定(Double-Check Locking)懶漢式單例在第一次調(diào)用getInstance()方法時實例化,在類加載時并不自行實例化,這種技術(shù)又稱為延遲加載(Lazy Load)技術(shù),即需要的時候再加載實例。

5 餓漢式單例類在類被加載時就將自己實例化,它的優(yōu)點在于無須考慮多線程訪問問題,可以確保實例的唯一性;從調(diào)用速度和反應時間角度來講,由于單例對象一開始就得以創(chuàng)建,因此要優(yōu)于懶漢式單例。但是無論系統(tǒng)在運行時是否需要使用該單例對象,由于在類加載時該對象就需要創(chuàng)建,因此從資源利用效率角度來講,餓漢式單例不及懶漢式單例,而且在系統(tǒng)加載時由于需要創(chuàng)建餓漢式單例對象,加載時間可能會比較長。
直接對方法加鎖的缺陷:每次調(diào)用方法都需要加鎖,即使時能直接返回實例時,這樣效率低。
兩層檢查的作用:第一層延遲加載,第二層確保唯一的實例。

懶漢式單例類在第一次使用時創(chuàng)建,無須一直占用系統(tǒng)資源,實現(xiàn)了延遲加載,但是必須處理好多個線程同時訪問的問題,特別是當單例類作為資源控制器,在實例化時必然涉及資源初始化,而資源初始化很有可能耗費大量時間,這意味著出現(xiàn)多線程同時首次引用此類的機率變得較大,需要通過雙重檢查鎖定等機制進行控制,這將導致系統(tǒng)性能受到一定影響。

6 Initialization Demand Holder (IoDH)的技術(shù):我們在單例類中增加一個靜態(tài)(static)內(nèi)部類,在該內(nèi)部類中創(chuàng)建單例對象,再將該單例對象通過getInstance()方法返回給外部使用。通過使用IoDH,我們既可以實現(xiàn)延遲加載,又可以保證線程安全,不影響系統(tǒng)性能,不失為一種最好的Java語言單例模式實現(xiàn)方式。
延遲加載:內(nèi)部類在第一次getInstance的時候才加載,去初始化其靜態(tài)成員變量。
線程安全:因為JVM不會兩次去加載一個類,所以new Instance()只會執(zhí)行一次。

優(yōu)點與缺點:
優(yōu)點:內(nèi)存中只存在一個實例,減少了內(nèi)存開支,減少了系統(tǒng)的性能開銷。
缺點:單例模式一般沒有接口,擴展很困難,除非修改代碼。
Android中應用:InputMethodManager

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容