單例設計模式 餓漢式與懶漢式小結

2022-07-22 04:09:13 字數 2152 閱讀 8699

什麼是單例設計模式?

單例設計模式  要求乙個類有且僅有乙個例項,並且提供了乙個全域性的訪問點。這個單例不應該由人來控制,而應該由**來限制。

單例設計模式的思路:

1.私有化建構函式

2.私有化靜態類變數

3.對外提供獲取例項的方法

常見的單例設計模式有兩種:懶漢式,餓漢式

1,餓漢式--靜態常量--類變數直接例項化

public

class

singleton1

//2.私有化靜態類變數並直接例項化---類載入的時候就完成了例項化,final對於不同的應用場景可加可不加。

private

final

static singleton1 instance = new

singleton1();

//3.對外提供獲取該例項的方法

public

static

singleton1 getinstance()

}

小結:優點:寫法簡單,類載入的時候就完成了例項化,避免了執行緒同步不安全的問題。

缺點:正由於類載入就完成例項化的特點,如果一直未使用該例項,那麼就會造成記憶體的浪費。

2.餓漢式--靜態**塊---類變數在靜態**塊中被例項化

public

class

singleton1

//2.私有化靜態類變數,並在靜態**塊中為該變數賦值

private

static

singleton1 instance;

static

//3.對外提供獲取該例項的方法

public

static

singleton1 getinstance()

}

小結:(其實這種寫法與上面的寫法類似,只是將直接賦值操作轉移到了靜態**塊中間接賦值,其實現原理相同,都是在類載入的時候完成了例項化)

優點:寫法簡單,類載入的時候就完成了例項化,避免了執行緒同步不安全的問題。

缺點:正由於類載入就完成例項化的特點,如果一直未使用該例項,那麼就會造成記憶體的浪費。

3.懶漢式--雙重(判斷)加鎖機制

public

class

singleton

//2.宣告私有靜態變數

private

static

singleton instance;

//3.給外界提供獲取物件的方法

public

static

singleton getinstance() }}

return

instance;

}}

小結:這種寫法是懶漢式單例設計模式較優的寫法,實現了執行緒安全、延遲載入、效能較優。

4.懶漢式--靜態內部類

public

class

singleton

//2.靜態內部類:靜態內部類在外部類singleton載入的時候不會被例項化,

//而是在呼叫getinstance方法時,才會被載入完成例項化,這個特點為我們實現了延遲載入。

//同時靜態內部類只會在第一次載入的時候完成初始化,而在初始化過程中其他執行緒無法進入(jvm的功勞),從而保證了執行緒安全。

private

static

class

singletoninstance

//3.對外提供獲取例項的方法

public

static

singleton getinstance()

}

小結:這種設計模式完美的解決了餓漢式沒有延遲載入的弊端,良好的解決了記憶體浪費問題。具有執行緒安全、延遲載入、效率高特點。

單例設計模式的應用場景:

1.工具類物件

2.建立物件時耗時過多或者消耗資源過多,但又經常使用的物件。比如:jdbc連線物件connection,redis連線物件jedis等

3.頻繁建立和銷毀的物件

單例設計模式 懶漢式與餓漢式

1 概念 在某些場合中,乙個類對外提供乙個且只提供乙個物件時,這樣的類的類叫做單例類。編寫單例類的模式叫做單例設計模式,是程式設計的總結。2 思路 在程式中,如果其它的類需要用到這個類的物件,都是通過new的方式建立類物件,這時就根本無法控制其他類new物件的個數,那麼如何保證保證只有乙個new物件...

設計模式 單例模式 餓漢式,懶漢式

餓漢式 將物件的實現提前準備好,物件指向的記憶體只能有乙個。public class singlection1 餓漢式單例實現 將物件的實現提前準備好 private static final singlection1 single1 new singlection1 靜態工廠 public sta...

單例模式 懶漢式與餓漢式

什麼是單例設計模式 保證這個類的物件永遠有且只有乙個。單例設計模式有兩種 見如下兩種宣告方式 1.懶漢式 設計單例模式 懶漢式 先建立乙個私有的靜態物件 private static user user 建立乙個私有的構造方法 private user 建立乙個公有的靜態的返回物件的方法,需要判斷 ...