1.單例的定義
單例設計模式(Singleton Design Pattern)理解起來非常簡單。一個類只允許創(chuàng)建一個對象(或者叫實例)从绘,那這個類就是一個單例類访忿,這種設計模式就叫作單例設計模式,簡稱單例模式讹躯。
2.單例的用處
從業(yè)務概念上菩彬,有些數(shù)據(jù)在系統(tǒng)中只應該保存一份,就比較適合設計為單例類潮梯。比如骗灶,系統(tǒng)的配置信息類。除此之外秉馏,我們還可以使用單例解決資源訪問沖突的問題耙旦。
3.單例的實現(xiàn)
單例有下面幾種經(jīng)典的實現(xiàn)方式。
餓漢式
餓漢式的實現(xiàn)方式萝究,在類加載的期間免都,就已經(jīng)將instance靜態(tài)實例初始化好了,所以帆竹,instance實例的創(chuàng)建是線程安全的绕娘。不過,這樣的實現(xiàn)方式不支持延遲加載實例栽连。
懶漢式
懶漢式相對于餓漢式的優(yōu)勢是支持延遲加載险领。這種實現(xiàn)方式會導致頻繁加鎖、釋放鎖秒紧,以及并發(fā)度低等問題绢陌,頻繁的調(diào)用會產(chǎn)生性能瓶頸。
雙重檢測
雙重檢測實現(xiàn)方式既支持延遲加載熔恢、又支持高并發(fā)的單例實現(xiàn)方式脐湾。只要instance被創(chuàng)建之后,再調(diào)用getInstance()函數(shù)都不會進入到加鎖邏輯中叙淌。所以秤掌,這種實現(xiàn)方式解決了懶漢式并發(fā)度低的問題。
靜態(tài)內(nèi)部類
利用Java的靜態(tài)內(nèi)部類來實現(xiàn)單例鹰霍。這種實現(xiàn)方式机杜,既支持延遲加載,也支持高并發(fā)衅谷,實現(xiàn)起來也比雙重檢測簡單椒拗。
枚舉
最簡單的實現(xiàn)方式,基于枚舉類型的單例實現(xiàn)。這種實現(xiàn)方式通過Java枚舉類型本身的特性蚀苛,保證了實例創(chuàng)建的線程安全性和實例的唯一性在验。
4.單例存在哪些問題?
單例對OOP特性的支持不友好
單例會隱藏類之間的依賴關系
單例對代碼的擴展性不友好
單例對代碼的可測試性不友好
單例不支持有參數(shù)的構造函數(shù)
5.單例有什么替代解決方案堵未?
為了保證全局唯一腋舌,除了使用單例,我們還可以用靜態(tài)方法來實現(xiàn)渗蟹。不過块饺,靜態(tài)方法這種實現(xiàn)思路,并不能解決我們之前提到的問題雌芽。如果要完全解決這些問題授艰,我們可能要從根上,尋找其他方式來實現(xiàn)全局唯一類了世落。比如淮腾,通過工廠模式、IOC容器(比如Spring IOC容器)來保證屉佳,由程序員自己來保證(自己在編寫代碼的時候自己保證不要創(chuàng)建兩個類對象)谷朝。