保證乙個類僅有乙個例項 單例模式

2021-09-05 20:33:18 字數 1625 閱讀 7034

場景:微軟的windows xp作業系統,ctrl+alt+del鍵都會彈出乙個windows任務管理器(這時不關閉這個任務管理器),繼續ctrl+alt+del鍵還是乙個windows任務管理器。鑑於本人水平有限,上面的場景舉例可能不合適,但是很接近乙個基本的設計模式:單例模式。code is cheap.下面用c#**模擬出乙個類似任務管理器的建立:

using

system;

//////

singleton 單例模式

///public

class

windowstaskmanager

public

static

windowstaskmanager createsinglewtm()

return

wtm;}}

//////

客戶端呼叫

///public

class

client }}

上面建立例項的基本思想是new乙個物件的時候,判斷靜態的類變數是否已經有例項,建構函式私有,這樣外部**不能直接new來例項化物件。這是因為我們都知道所有類都有建構函式,不編碼寫建構函式則系統預設生成無引數的構造方法,但如果有顯式定義的構造方法,預設的就會失效。ps:在定義可序列化的類的時候,預設建構函式是必須的,所以如果你顯式定義了乙個帶引數的構造方法,一定不能忘記要再寫乙個沒有引數的構造方法。

好了,上面的**ms已經簡單的實現了對唯一例項的受控訪問。不過在多執行緒的程式中,上面的**會有可能建立多個例項的。給程序加把鎖,用lock解決一下:

using

system;

using

system.threading;

//////

singleton 

///public

class

windowstaskmanager

public

static

windowstaskmanager createsinglewtm()

}return

wtm;}}

上面那種做法可以建立單一例項,可是每次呼叫建立方法時,都要lock,影響效能,有一種雙重鎖定的方法:

using

system;

using

system.threading;

//////

singleton  雙重鎖定

///public

class

windowstaskmanager

public

static

windowstaskmanager createsinglewtm()}}

return

wtm;}}

最後再看乙個所謂的餓漢式單例類:

using

system;

using

system.threading;

//////

singleton  sealed防止派生增加例項

///public

sealed

class

windowstaskmanager 

public

static

windowstaskmanager createsinglewtm()}

單例模式(乙個類只能建立乙個例項)

三個步驟 通過new乙個靜態變數 private static single single new single1 構造方法私有化 private single 新建乙個公共獲取物件的方法 靜態 public static single getintance return 這個物件 一共有七中單例模...

單例模式,乙個類只能有乙個例項。地球只有乙個。

單例設計模式 單例設計模式就是保證某個類的例項有且只能有乙個不能隨意建立例項。例如 我們只有乙個地球,地球類的例項只能建立乙個。1 為了阻止類例項的new建立,可以做乙個private的建構函式。2 既然不能從外部使用new進行例項的建立,就從類內部進行例項的建立,為此可以提供乙個靜態方法和乙個要建...

保證乙個類只有乙個例項存在

需求 在做一些彈出視窗的時候,往往需要在新的彈出視窗被建立出來之前,要檢查是否已經有視窗存在。如果存在,則先移除已經存在的例項,然後再建立新的例項。這樣就保證了乙個類只有乙個例項存在。思路 主要就是在類中設定乙個指向自身的靜態屬性。package private function show void...