本篇通過代碼講解6種不同的單例模式的實現方式, 分別是: 饑餓模式、懶惰模式、雙重檢查鎖模式、靜態內部類模式、枚舉類模式和ThreadLocal模式, 並分析了它們之間的優缺點, 最後還介紹了JDK中常見的單例模式的應用, 以及破壞單例模式的多種方法. ...
目錄
- 1 為什麼要用單例模式
- 2 寫法① - 饑餓模式
- 3 寫法② - 懶惰模式
- 4 寫法③ - 雙重檢查鎖模式
- 5 寫法④ - 靜態內部類實現單例
- 6 寫法⑤ - 枚舉類實現單例
- 7 寫法⑥ - 通過ThreadLocal實現單例
- 8 擴展: JDK中的單例 以及 如何破壞單例模式
- 9 擴展 - 性能對比
1 為什麼要用單例模式
1.1 什麼是單例模式
單例模式就是: 在程式運行期間, 某些類有且最多只有一個實例對象.
我們的應用中可能存在這樣的需求: 某些類沒有自己的狀態, 在程式運行期間它們只需要有一個實例, 換句話說, 無論為這些類創建多少個實例, 對程式的運行狀態、運行結果都不會產生影響.
更重要的一點是: 有些類如果存在兩個或者兩個以上的實例, 應用程式就會發生某些匪夷所思的錯誤, 不同於空指針、數組越界、非法參數等錯誤, 這樣的問題一般都很難提前發覺和定位.
這個時候, 我們就應該把這樣的類控製為單例結構 —— 確保程式運行期間最多只有一個相對應的實例對象.
關於類的狀態的理解:
① 比如有一個 Person 類, 它有成員變數name、age等等, 不同的姓名和年齡就是不同的人, 也就是說這些變數都是不確定的, 這樣的類就是有狀態的類.
② 而像一些配置類, 比如 RedisProps (Redis的配置信息)類, 它的所有屬性和方法都是static的, 沒有不確定的屬性, 這樣的類就可以認為是沒有狀態的類.
—— 純屬個人看法, 若理解有誤, 還請讀者朋友們提出, 歡迎批評和交流