天天看點

【設計模式】Java中單例模式Singleton

單例(Singleton)模式的定義:指一個類隻有一個執行個體,且該類能自行建立這個執行個體的一種模式;這個類提供了一種通路其唯一的對象的方式,可以直接通路,不需要執行個體化該類的對象。

核心代碼:構造方法私有化,private。提供一個靜态的公開對外擷取執行個體的方法

單例模式有 3 個特點:

單例類隻有一個執行個體對象;

該單例對象必須由單例類自行建立;

單例類對外提供一個通路該單例的全局通路點。

單例模式的優點和缺點

單例模式的優點:

單例模式可以保證記憶體裡隻有一個執行個體,減少了記憶體的開銷。

可以避免對資源的多重占用。

單例模式設定全局通路點,可以優化和共享資源的通路。

單例模式的缺點:

單例模式一般沒有接口,擴充困難。如果要擴充,則除了修改原來的代碼,沒有第二種途徑,違背開閉原則。

在并發測試中,單例模式不利于代碼調試。在調試過程中,如果單例中的代碼沒有執行完,也不能模拟生成一個新的對象。

單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則。

1.懶漢式

懶漢式,就是執行個體在用到的時候才去建立,比較懶,直到用到的時候才去檢查有沒有建立。有線程安全問題,如果剛開始有多個線程同時調用則會被建立多次。可以加上synchronized,所有又分成了線程安全和線程不安全兩種寫法

2.餓漢式

餓漢式,就是不管有沒有用到,啟動的時候先建立執行個體,比較勤奮,壞處就是浪費記憶體空間,好處就是沒有線程安全問題

3.雙檢鎖

雙檢鎖結合了懶漢式和餓漢式,在建立的時候保證線程安全,這樣又保證了線程安全,比直接上鎖提高了效率,又節省了空間

4.靜态内部類

靜态内部類,靜态初始化器,由JVM來保證線程安全 ,隻有被調用到時才會裝載,進而實作了延遲加載。

5.枚舉

枚舉自動支援序列化機制,絕對防止多次執行個體化。

在實際的應用場景中一般用到的懶漢式和雙檢鎖比較多