設計模式之 單例模式

2021-08-19 18:23:48 字數 1962 閱讀 3912

1. 預熱

為了小夥伴們能夠比較好的理解後面講解,先將一些前置的概念在這裡進行預熱,假如你已經知道這裡概念,你可以跳過這個小結。

2. 實現方法分析

實現單例模式估計是全地球人都知道的設計模式了,它又有懶漢模式餓漢模式之分,區別在於對單例物件初始化的時機不同,懶漢模式顧名思義,比較懶,所以物件的初始化會放到使用的那乙個刻才會進行!餓漢反之,具體孰好孰壞,這個得兩說,就餓漢來說,如果單例物件比較輕(廢話,要是很輕還用單例搞鬼麼)和初始化比較快且後續一定使用的話,這個就無所謂了!比較推薦,但是如果不用,這樣就有點浪費伺服器的效能和資源了!接下來我會提供這兩種模式的幾種實現方式!

a) 懶漢模式

/**

* 兩種經典的餓漢式實現**

@author

lin.jianfei

*@version

1.0.0

*@since

2018-05-07

*/class singleton4eager1

private static singleton4eager1 instance

= new singleton4eager1();

public static singleton4eager1 getinstance()

}class singleton4eager2

// 需要注意靜態**的順序,靜態**塊是按照編寫的順序執行

private static singleton4eager2 instance

= null;

static

public static singleton4eager2 getinstance()

}

b) 懶漢式

class singleton4lazy1 

private singleton4lazy1 instance = null;

// 執行緒不安全

public singleton4lazy1 getinstance()

return

instance;}

}class singleton4lazy2

private singleton4lazy2 instance = null;

// 執行緒安全,效率低下

public synchronized singleton4lazy2 getinstance()

return

instance;}

}class singleton4lazy3

// 這裡加上

volatile

修飾,禁止指令優化重排

private volatile singleton4lazy3 instance = null;

// 執行緒安全,引入

volatile +

雙重校驗 改善併發效能

,public synchronized singleton4lazy3 getinstance() }}

return

instance;}

}class singleton4lazy4

private singleton4lazy4 instance = null;

public singleton4lazy4 getinstance()

private enum innersingleton

public singleton4lazy4 getinstance()

}}

3. 總結

這裡,實現餓漢式有好多種方式可以實現,可以根據自己的業務場景需要進行選擇,如果是單執行緒的場景,無疑是第一種最好,類似stringbuilder 和 stringbuffer。假如涉及到併發的話,建議採用最後用列舉方式的實現,即避免了鎖的損耗且延遲載入!

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...