java 設計模式之單例模式

2021-07-07 05:18:59 字數 1956 閱讀 7368

單例模式通常有兩種,餓漢單例和懶漢單例。

餓漢單例模式:

public class singleton 

public void setflag(int flag)

private singleton()

public static singleton getinstance()

懶漢單例模式

public class singleton2 

public static synchronized singleton2 getinstance()

return singleton;

}

餓漢單例模式中有乙個 flag成員,以及相應的get和set方法。這不是單例模式必須的。方便後文做測試。

可以看到,它們都有乙個共同點,那就是都有乙個靜態的成員,且該成員就是自己。同樣,它們都有乙個靜態方法,去返回自己的例項。

這樣做有什麼意思呢,根據我自身的體會,剛開始學的時候,會不明白,這個模式怎麼就能返回乙個自己的例項,而且,在初始化例項的時候,物件本身有乙個自己這個物件的方法,難道不會陷入死迴圈麼,自己例項化的成員物件,又例項化乙個。

出現這樣的疑問,是自己基礎不牢固的問題。

其實是這樣的

類定義中不能包含自己本身的物件,否則會引起像無限遞迴的問題,而靜態成員屬於類,而不屬於物件,靜態成員的作用域屬於類,但不佔類的大小,不屬於類的物件,內存在全域性儲存區。

靜態成員是不屬於類的例項的,它是類的在編譯的時候初始化放在全域性變數裡面的。

我們總是把模擬喻成 一座大樓的圖紙,而例項物件就是建造出來的大樓。但是靜態成員是已經存在的東西,他不屬於當時實際建造出來的那個大樓,而是圖紙本身帶有的東西。

繼續因為已經類的成員是靜態的了,而且是私有的,所以,想要獲得這個靜態物件,就必須通過類的方法返回。所以我們需要乙個可以 return singleton型別的方法。

這就是實現單例模式的基本思路。

那麼懶漢和餓漢有什麼區別呢,其實看名字也能了解。

餓漢是不管你什麼時候用,我都在程式編譯的時候,就生成乙個靜態物件放在全域性變數區裡面(就好像餓了很久的人迫不及待地去做吃東西)

懶漢是你什麼時候用,我什麼時候給你例項乙個物件,我不會在程式編譯的時候生成物件(就好像乙個有拖延症的人,等到deadline來的時候才會去做)

既然這樣,我們可以思考乙個問題,餓漢因為迫不及待的去做(編譯時就有了例項),所以當我們想要得到例項的時候,我們可以放心大膽的拿來用。

那麼在懶漢模式,我們怎麼知道有沒有已經生成的例項的呢?

可以輕而易舉地想到:加個if語句判斷一下,如果這個靜態成員為null,那麼就例項化。

這樣做其實是會出現問題的:如果很多人在同時使用了這個方法,而此時靜態成員卻為null,那麼系統會生成多於乙個的靜態例項(事實上會報錯)。所以,我們

給方法加乙個 synchronized,表示這個方法只能同時被乙個執行緒使用。

乙個簡單的測試方法:

public class testsingleton

思路:既然返回同乙個單例,那麼我在第乙個引用中存入乙個數值給乙個變數,然後通過getinstance()給予第二個引用單例,在第二個引用中獲取這個變數,如果這個變數的數值和我存的一樣,那麼就證明這是同乙個例項。

2015.11.6 補充:單例模式其實就是將宣告和例項化分開 ,讓類把類的例項化掌握在自己的手裡,至於呼叫者呼叫哪個例項,都是類自己說了算,所以可以在getinstance方法裡面新增各種限制。由此,我想到了生活中類似的場景:公司的員工需要用到各種辦公文具,一開始公司要求員工自己去買,買了之後拿發票報銷,採用單例模式之後,員工不再自己去買,而是去向公司申請,至於公司是給新的文具,還是舊的文具,都是公司自己說了算。

java設計模式之單例模式

單位面試題目中有一道關於單例模式的題目.大多數參加筆試的同事都會寫出getinstance這個函式,但是當我問起什麼情況下需要使用單例 單例具體有什麼好處的時候 static函式也可以構建唯一例項,為什麼還需要單例.從使用單例的經驗來看,如下場景下,個人感覺應該使用單例 1.如果需要構建乙個工具類,...

java設計模式 之 單例模式

單例模式 有些類在程式執行過程中只需要儲存乙個例項,比如檔案管理類,音訊管理類,那麼我們如何實現乙個單例類呢?有以下幾點 1 定義乙個靜態變數 2 建構函式私有化 3 提供乙個public 靜態方法,獲取這個例項 4 一定要做執行緒同步 public static class singleton p...

Java設計模式之單例模式

說到單例模式 大家一定非常熟悉 這是最常見也是設計模式中相對簡單 好理解的設計模式 今天就跟大家掰一掰單例模式 單例模式確保某個類只有乙個例項 應用場景 執行緒池 快取 等物件常常被設計成單例 然而單例分兩種 1 惡漢式 2 懶漢式 我們先來看下 惡漢式 public class singleton...