17 單例模式 原來單例模式有這麼多種實現

2021-08-15 16:30:11 字數 1439 閱讀 2484

單例模式(singleton):保證乙個類只有乙個例項,並保證只有唯一的訪問點。

uml圖:

* 懶漢式—單執行緒

*/class singleton1

public static singleton1 getinstance()

return instance;

}}/*

* 懶漢式—支援併發,同步方法,但效能低

* 無論instance是否例項化都要加鎖

*/class singleton2

public synchronized singleton2 getinstance()

return instance;

}}/*

* 懶漢式—支援併發,同步**塊,效能高

* 只有instance沒有例項化時才加鎖,如果例項化了直接返回 雙重鎖定

*/class singleton3

public singleton3 getinstance() }}

// 這樣instance != null 可以直接返回

return instance;

}}/*

* 餓漢式—靜態初始化,獲得例項速度快,應用初始化時耗資源

* 一般情況餓漢式能滿足單例需求

*/class singleton4

public static singleton4 getinstance()

}結果:

true

true

true

true

單例模式實現的類只能被例項化一次,只有乙個例項存在應用中。應用的場景也非常多,比如作業系統裡的**站、任務管理器、我的電腦等都是單例模式實現的。還有最常用的框架spring初始化例項預設的就是單例。

不管什麼方式要單例模式要掌握三點,1、私有的本類屬性,2、構造方法私有化,3、為獲得單例提供乙個靜態方法。

單例分兩種,懶漢式和餓漢式

懶漢式採用靜態初始化的方式在類載入的時候就初始化例項,而餓漢式是第一被呼叫getinstance()才例項化的。餓漢式又細分為兩種,只支援單執行緒的和支援多執行緒併發的,支援併發的餓漢式分為同步方法和同步**塊雙重鎖定兩種方式。而綜合考慮,餓漢式和懶漢式的雙重鎖定具有優勢,他們都支援併發不會被例項化多次,餓漢式獲得例項的速度最快但類載入時好資源,雙重鎖定比較省資源但第一次獲得例項時比較耗時。可以根據情況來選擇單例模式的實現方式,一般來說用餓漢式就可以了。

不管什麼方式要單例模式要掌握三點,1、私有的本類屬性,2、構造方法私有化,3、為獲得單例提供乙個靜態方法。

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

設計模式 17 單例模式

單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點 原書 舉個例子 例如計畫生育,每對夫婦只能有乙個孩子 public class main class children public static children getinstance return children 執行結果 t...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...