常用設計模式 單例設計模式

2021-10-24 08:36:47 字數 2183 閱讀 1008

​ 它的運作方式是這樣的: 如果你建立了乙個物件, 同時過一會兒後你決定再建立乙個新物件, 此時你會獲得之前已建立的物件, 而不是乙個新物件。

​ 注意, 普通建構函式無法實現上述行為, 因為建構函式的設計決定了它必須總是返回乙個新物件。

​ 和全域性變數一樣, 單例模式也允許在程式的任何地方訪問特定物件。 但是它可以保護該例項不被其他**覆蓋。

所有單例的實現都包含以下兩個相同的步驟:

​ (1)將預設建構函式設為私有, 防止其他物件使用單例類的 new運算子。

​ (2)新建乙個靜態構建方法作為建構函式。 該函式會 「偷偷」 呼叫私有建構函式來建立物件, 並將其儲存在乙個靜態成員變數中。 此後所有對於該函式的呼叫都將返回這一快取物件。

一上來就載入物件,問題是可能會浪費記憶體
public

class

esingleton

public

static esingleton getinstance()

}

用的時候才會載入物件
下面的方式寫的話,單執行緒下單例ok,多執行緒下就有問題會出現多個,就沒有實現單例

public

class

lsingleton

/**

* 單執行緒下單例ok,多執行緒下就有問題會出現多個

* @return

*/public

static lsingleton getinstance()

return lsingleton;

}public

static

void

main

(string[

] args)).

start()

;}}}

雙重檢測鎖模式的 懶漢式單例  dcl懶漢式
解決了併發的問題,volatile關鍵字解決了原子性

如果不加volatile

不是原子性操作

分配記憶體空間

執行構造方法,初始化物件

把這個物件指向這個空間

預想的排序,123

出現指令重排

a執行緒先執行了 13 將空物件指向 空間

b執行緒:由於已經指向了空間,就認為不為null,return的時候此時並沒有完成構造,就要加volatile(防止指令重排)

問題:通過反射來建立物件的話就會有問題,並不是單例的

public

class

lsingleton

/**

* 雙重檢測鎖模式的 懶漢式單例 dcl懶漢式

* 會處理併發的問題,併發狀態下只有乙個

* @return

*/public

static lsingleton getinstance()

}}return lsingleton;

}public

static

void

main

(string[

] args)

throws exception

}

三重檢測鎖模式的 懶漢式單例

就算物件全用反射建立,就會直接報錯

如果對應已經單例建立,再用反射建立一樣會拋異常

public

class

lsingleton

else}}

/**

* 雙重檢測鎖模式的 懶漢式單例 dcl懶漢式

* 會處理併發的問題,併發狀態下只有乙個

常用設計模式 單例模式

1.單例模式的特點 1.單例類在系統中僅有乙個例項 2.單例類必須自己建立自己的例項 3.單例類必須向系統中的其他物件提供這個例項 2.單例模式的兩種模式 public class test 2.1 餓漢模式 public class singleton 建立類的唯一例項 private stati...

常用設計模式 單例模式

一 單例模式定義 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,...

常用設計模式 單例模式

應用執行過程當中,只有乙個物件的模式,叫做單例模式 1.構造器私有 2.提供可以獲得物件的靜態方法 3.將物件設定為靜態 懶漢模式 用的時候再建立 餓漢模式 載入的時候就建立 public class singleton 構造器私有,無法在外部例項化這個物件 外部一千一萬個物件也都只能是對perso...