白話設計模式之單例模式(7種寫法)

2021-10-09 02:59:10 字數 2980 閱讀 3651

學習設計模式的時候 ,往往第乙個就是單例模式,啥是單例模式呢?接下來我就為大家梳理一下7種寫法

1.定義

ensure a class has only one instance, and provide a global point of access to it.(確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。)

2,單例模式滿足條件

1.構造方法必須進行私有化

2.例項必須是乙個且唯一,並且必須加上static屬性

3.對外提供獲取該類物件的共有方法也是static屬性

3. 單例模式寫法

餓漢式(靜態常量,靜態**塊) 都是執行緒安全的

懶漢式(執行緒不安全,執行緒安全,同步**塊,雙重檢驗)

靜態內部類  列舉

寫之前科普一下,啥是餓漢式====> 在程式建立的時候就進行初始化,並且物件唯一 , 反之懶漢式 需要時才建立於堆中

3.1,靜態常量餓漢式寫法

/**

* 靜態常量餓漢式

優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。

缺點:在類裝載的時候就完成例項化,沒有達到lazy loading的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。

*/public class singleton

private final static singleton instance = new singleton();

private static singleton getinstance()

}

3.2,靜態**塊餓漢式寫法

/**

*  靜態**塊餓漢式  與靜態常量類似

*  只不過將類例項化的過程放在了靜態**塊中,也是在類裝載的時候,就執行靜態**塊中的**,初始化類的例項。

*/class singleton1

static

private static singleton1 getinstance()

}

3.3, 執行緒不安全懶漢式寫法

/**

*  執行緒不安全懶漢式 適合單執行緒

*  如果在多執行緒下,乙個執行緒進入了if (null == instance)判斷語句塊,還未來得及往下執行,

*  另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式。

*/public class singleton2

private static singleton2 getinstance()

return instance;

}}

3.4, 執行緒安全懶漢式寫法 synchronized 

/**

* 執行緒安全懶漢式 + synchronized 關鍵字

*  效率太低了,每個執行緒在想獲得類的例項時候,執行getinstance()方法都要進行同步。

*  而其實這個方法只執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了。方法進行同步效率太低要改進。

*/class singleton3

private static synchronized singleton3 getinstance()

return instance;

}}

3.5, 同步**塊懶漢式寫法 

/**

* 同步**塊懶漢式

* 改為同步產生例項化的的**塊。但是這種同步並不能起到執行緒同步的作用。跟第3種實現方式遇到的情形一致,

* 假如乙個執行緒進入了if (null == instance)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。

*/class singleton4

private static synchronized singleton4 getinstance()

return instance;

}}

3.6,雙重檢查懶漢式寫法 

/** 雙重檢查(推薦使用)

*  * double-check概念對於多執行緒開發者來說不會陌生,如**中所示,

*  * 我們進行了兩次if (singleton == null)檢查,這樣就可以保證執行緒安全了。

*  * 這樣,例項化**只用執行一次,後面再次訪問時,判斷if (singleton == null),直接return例項化物件。

*  * 優點:執行緒安全;延遲載入;效率較高。

*/class singleton5

private static singleton5 getinstance()}}

return instance;

}}

3.7,靜態內部類寫法

/**

* 靜態內部類

* 這種方式跟餓漢式方式採用的機制類似,但又有不同。兩者都是採用了類裝載的機制來保證初始化例項時只有乙個執行緒。不同的地方在餓漢式方式是只要singleton類被裝載就會例項化,沒有lazy-loading的作用,而靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化。

* * 類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。

* * 優點:避免了執行緒不安全,延遲載入,效率高。

*/class singleton6

private static class singletoninstance

private static singleton6 getinstance()

}

ps 未完待續。。。

**位址 :

歡迎star

白話設計模式之 單例模式

先說定義 單例模式是為了保證乙個物件在乙個系統中之有乙份執行中的例項 這個在生活中可以舉很多例子 例如 給水桶接水的事件中,客觀的條件上來說,就只有乙個水桶 因此在系統設計中,單個水桶在接水的事件中就必須是單例的。銀行對某個人賬戶的操作也是也必須保證賬戶中的總金額,支出和收入計算出來不能出現偏差 這...

設計模式系列 單例模式的7種寫法

單例模式是一種常用的軟體設計模式,在他的核心結構中只包含乙個被稱為 單例的特殊類。通過單例模式可以保證系統只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。singletom類,定義乙個getinstanc...

23種設計模式之單例模式(8種寫法)

23種設計模式之單例模式 8種寫法 餓漢式 高效 沒有執行緒安全問題 簡單 jvm保證執行緒安全問題 public class merge01 public static merge01 getinstance public static void main string args 用靜態塊初始化 ...