摘要:那有什么辦法保證只有一個領導人斯大林呢較常見的兩種方式餓漢式和懶漢式二實戰圖這里提示一點,在學習設計模式的時候,圖會讓你更容易,而且深刻的去理解到該模式的核心。下一篇的設計模式是工廠方法模式。
??就算不懂設計模式的兄弟姐妹們,想必也聽說過單例模式,并且在項目中也會用上。但是,真正理解和熟悉單例模式的人有幾個呢?接下來我們一起來學習設計模式中最簡單的模式之一——單例模式
一、為什么叫單例模式???“baby,你就是我的唯一,兩個世界都變形,回去談何容易...”。咳咳~就先唱到這吧,入正題。每次提起單例模式,筆者都會哼起這首王力宏的《唯一》。為什么?這首歌哪里吸引我了?就是“唯一”這兩個非常有糞量的字。
斯大林時期的蘇聯,個人崇拜達到相當嚴重的程度。然而為什么會導致個人崇拜呢?很簡單,那就是“只有一個斯大林,只有一個領導人”!不允許出現兩個或者多個領導人,國家政務、外交等等大事小事都需要斯大林來發號施令。
定義??保證一個類只有一個實例,并且整個系統能訪問該實例。
特點單例類保證只有一個實例
單例類必須自己創建自己的唯一實例
單例類提供給系統提供該唯一實例
單例的定義也就是這么簡單,還不明白?直白點就是該類只能new一個對象,不允許new第二個對象,而系統訪問的就是該對象。
那有什么辦法保證只有一個領導人斯大林呢?較常見的兩種方式:餓漢式和懶漢式
這里提示一點,在學習設計模式的時候,UML圖會讓你更容易,而且深刻的去理解到該模式的核心。況且,UML圖也是成為項目管理者必備的技能。
上代碼如何確保一個系統只產生一個實例?這里必須使用private修飾構造函數,并且在構造函數里邊實例化。
前面提到了單例模式比較常見的兩種方式:餓漢式和懶漢式。下面我們來具體看看到底有多餓,以及到底有多懶!
首先,來看一下餓漢式單例模式。
餓漢式單例代碼如下:
public class EagerSingleton { private static EagerSingleton singleton = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton getSingleton() { return singleton; } }
??注意,這里獲取實例必須使用靜態方法,要不然類外部無法訪問通過該方法得到唯一實例。
“餓漢式”顧名思義,已經等不及外部需要用到的時候才實例化,于是在裝載類的時候就創建對象實例,一個自力更生的好榜樣~
餓漢式單例存在的問題主要是:既然在初始化的時候就已經裝載類,必然會消耗內存。
懶漢式單例代碼如下:
public class LazySingleton { private static LazySingleton singleton = null; private LazySingleton() { } public static synchronized LazySingleton getSingleton() { if (instance == null) { singleton = new LazySingleton(); } return singleton; } }
??這里使用了synchronized進行同步,以保證線程安全
“懶漢式”的定義也容易理解,因為懶,所以當需要使用到該實例的時候才去創建對象實例,在此之前不對類進行實例化。
懶漢式單例主要問題:由于它的實現是線程安全的,會降低對實例的訪問速度,并且每次都需要進行判斷。
??來到這的時候,既然上面兩個方式的單例都存在著問題,那有沒有一種方式,既能保證性能受到的影響小,并且可以保證線程安全的呢?網上很多現有的資源都提及到雙重檢查加鎖,在我第一次看到這東西的時候就覺得名字都很麻煩,實際上它的實現也比較麻煩,還有就是volatile關鍵字對性能有所影響,因此不推薦使用,這里也不做介紹了。當然,選擇哪一種方式是根據個人實際項目的情況來選用的。
先別著急走,接下來登場的是比較完美的實現單例模式的方式枚舉單例
3、枚舉單例老規矩,先上代碼:
public enum Singleton { singleton; public void singletonFunc() { // 該單例需要實現的功能 } }
??是不是很簡單?而且因為自動序列化機制,保證了線程的絕對安全。三個詞概括該方式:簡單、高效、安全
三、總結??好了,設計模式系列的第一篇到這就結束了。大家覺得哪里需要改進,或者是需要筆者提供支持的可以下邊留言。剛開始的模式大家都比較容易理解,接下來才是重頭戲。下一篇的設計模式是:工廠方法模式。
設計模式Java源碼GitHub下載:https://github.com/jetLee92/DesignPattern
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67901.html
摘要:總結我們主要介紹到了以下幾種方式實現單例模式餓漢方式線程安全懶漢式非線程安全和關鍵字線程安全版本懶漢式雙重檢查加鎖版本枚舉方式參考設計模式中文版第二版設計模式深入理解單例模式我是一個以架構師為年之內目標的小小白。 初遇設計模式在上個寒假,當時把每個設計模式過了一遍,對設計模式有了一個最初級的了解。這個學期借了幾本設計模式的書籍看,聽了老師的設計模式課,對設計模式算是有個更進一步的認識。...
摘要:一基礎接口的意義百度規范擴展回調抽象類的意義想不想通過一線互聯網公司面試文檔整理為電子書掘金簡介谷歌求職記我花了八個月準備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對象深入分析 Java 中實例變量和類變量的區別 - 掘金原創文章,轉載請務必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點,閱讀更多有深度的文章。 實例變量 和 類變量...
摘要:單例模式的幾種實現方法具體如下懶漢模式優點可以延遲加載缺點多線程不安全餓漢模式優點多線程安全缺點加載類時就初始化完成無法延時加載雙重檢查優點多線程安全延遲加載缺點同步耗時靜態內部類優點多線程安全延遲加載耗時短與雙重檢查相比用緩存實現優 showImg(http://7xjhi6.com1.z0.glb.clouddn.com/Java-Design-Patterns-Logo.png)...
閱讀 2418·2021-09-08 09:45
閱讀 3364·2021-09-08 09:45
閱讀 3106·2019-08-30 15:54
閱讀 3361·2019-08-26 13:54
閱讀 1417·2019-08-26 13:26
閱讀 1394·2019-08-26 13:23
閱讀 917·2019-08-23 17:57
閱讀 2188·2019-08-23 17:14