設計模式 02 單例模式

2021-07-29 18:56:25 字數 1801 閱讀 2340

1 餓漢模式

宣告靜態物件時,已經初始化。

public

class singleton

public

static singleton getinstance()

}

2 懶漢模式

第一次呼叫getinstance時進行初始化。

缺點:每次呼叫getinstance都進行同步,造成不必要的同步開銷。

public

class singleton

private

static synchronized singleton getinstance()

return instance;

}}

3 dcl (double check lock)

第一步判空避免不必要的同步。

第二步判空是為了在instance=null時建立例項。

dcl失效:

instance = new singleton(); 分三步

1)給singleton的例項分配記憶體

2)呼叫singleton()的建構函式,初始化成員字段;

3)將instance物件只想分配的記憶體空間(此時instance就不是null了);

執行順序可能是1-2-3 也可能是1-3-2;

解決失效: private volatile static singleton instance = null;

public

class singleton

public

static singleton getinstance() }}

return instance;

}}

4 靜態內部類單例模式

public

class singleton

public

static singleton getinstance()

private

static

class singletonholder

}

第一次載入singleton類並不會初始化instance,只有第一次呼叫singleton的getinstance方法時,才會導致instance被初始化。這種方式能確保執行緒安全,也能保證單例物件的唯一性。也延遲了單例的例項化。

5 列舉單例

執行緒安全

public

enum singletonenum

為了避免反序列化會重新建立物件。需要加入如下方法

private object readresolve() throws objectstreamexception
也就是說在readresolve方法中將sinstance物件返回,而不是預設的重新生成乙個新的物件。

列舉不存在這個問題,即使反序列化也不會重新生成新的例項。

6 使用容器實現單例模式

將多種單例型別注入到乙個統一的管理類中,這種方式可以管理多種型別的單例。

public

class singletonmanger

public

static

void

setinstance(string key, object instance)

}public

static object getinstance(string key)

}

設計模式 02 單例模式

參考 需要某個類只保留乙個物件,如資料庫連線 網路連線 執行緒池等。只能有乙個例項 單例類必須建立自己的唯一例項 單列類向其他物件提供這一例項 單例可以繼承與被繼承,方法可以重寫。靜態類不行 單例產生的物件常駐記憶體。靜態類物件執行後會被釋放,被gc清理 單例模式可以延遲載入,靜態類在第一次執行時被...

設計模式 02 單例模式

餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全,同步方法 懶漢式 執行緒不安全,同步 塊 雙重檢查 推薦 靜態內部類 推薦 列舉注意事項和細節說明 所謂的單例設計模式,就是採取一定的方法,保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方...

設計模式 02 單例模式

描述 singleton 模式要求乙個類有且僅有乙個例項,並且提供了乙個全域性的訪問點 方式1 sealed class singleton 這種方式不能實現延遲初始化 呼叫時才進行初始化 它在編譯時就初始化出了乙個例項,sealed保證類不能被繼承。方式二 sealed class singlet...