Java設計模式之單例模式

2021-07-03 10:05:15 字數 1432 閱讀 5050

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

public class singleton1 ;

//2 私有化 此例項 為了確保在外界 不能隨便 用類名 去呼叫這個成員變數 我們應該另外提供方法

private static singleton1 instance = new singleton1();

//3 基於物件導向的封裝性 我們提供 get 方法供外界呼叫

public static singleton1 getinstance()

}

看到上面** 我們來說下第一步 如果不私有化構造方法 外界可以隨意訪問  那麼這樣 就沒有意義  也沒有做到所謂的單例,  如果你第一步忘記寫了 只要開發者 不去 new 構造 還是 使用get 方法獲取物件 是不影響代使用的  但是特別是在開發 框架 sdk 等 你如果少寫了第乙個私有化構造 這樣就會出問題 程式也補嚴謹,關於 2 3布 注釋已經非常詳細 這邊就不做過多贅述。

下面我們來看看 懶漢式

public class singleton2 ;

//我們只宣告 但是不 new 例項 需要的時候再 new

private static singleton2 instance;

// 我們每次需要的時候 如果有 就直接拿 如果沒有 我們才 new

public static singleton2 getinstance()

return instance;

}}

如果兩個執行緒 threada和 threadb分別開始執行初始化:threada: if (instance == null) 是真,然後進入條件區裡面裡面,在它還沒有到初始化那一步的時候,跳到 threadb:這時(instance==null)對threadb仍然是真,於是也進入到條件區裡面。接下來 threada和threadb接下來先後執行instance = new ... 就會分別給兩個執行緒兩個不同的instance了 解決同步的問題 可以加 synchronized 同步鎖

我們如何來驗證 是單例的呢  見下圖

看到輸出的結果 兩個物件雙等比較記憶體位址值 或者 你也可以直接把記憶體位址值 輸出 看看是否一樣 會得到@*** 的輸出,明顯看出 兩次拿例項都是 拿的同乙個物件 

惡漢式 和 懶漢式 的區別:

惡漢式 是隨著類的載入 就已經把例項載入出來了 不管你最後用還是沒用 這個例項 特點就是 載入類慢 執行快  懶漢式 特點就是 載入類快 執行慢

單例模式就介紹到這裡,謝謝

java設計模式之單例模式

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

java設計模式 之 單例模式

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

JAVA設計模式之單例模式

其實網上已經有很多介紹單例模式甚至是所有23種設計模式的了,都講得很好,所以這裡我不敢也不想說是為大家解疑惑,只是作為自己學習過程的筆記,以便以後進行查閱。單例模式的概念就不在具體介紹,其核心本質就是一種物件建立的模式,用於產生乙個物件的具體例項,它可以確保乙個類物件只有乙個例項。這樣做的好處是 1...