C 設計模式一 (單例模式singleton)

2021-10-02 14:40:11 字數 1718 閱讀 9633

c#單例設計模式

一、引言

單例設計模式屬於建立型模式。

什麼情況下用到單一設計模式呢?

1、在軟體中,經常有一些特殊的類,必須保證它僅僅例項唯一乙個物件。才能保證它們的邏輯正確性及良好的效率。

2、當然出於上面的乙個目的,我們要限制使用者使用new關鍵字,否則無法控制「唯一物件」的要求。我們更不能要求使用者去遵守單一原則,而是從我們設計者本本身來限制。即這應該是類設計者的責任,而不是使用者的責任。

單一例項模式的目的:

保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。

二、單一例項模式實現步驟

簡單來說,實現步驟也就是三步:

1、在類中存有乙個靜態的類的物件。

2、將建構函式私有化,限制使用者在類體外使用new。杜絕例項重複

3、開放乙個公開訪問的全域性訪問點。

三、實現單例模式的幾種方法:

/*方法1:

* 此方法在單執行緒中完全沒問題

* 在多執行緒中可能會有問題,例如兩個執行緒同時訪問,並同時執行到判斷instance==null語句

* 那麼兩個執行緒返回的結果都是true的話,則instance=new singleton2;語句就會執行2次,

* 當然這種概率特別低,但也不能排除此可能性。

* * 此外這種方式比較省資源,因為如果不訪問getinstance屬性的情況下,instance永遠為空。

*/class

singleton1

public

static

singleton1

getinstance()

//靜態方法,無需新建物件即可使用,解決無法使用new的問題}}

return instance;

//否則說明類已經例項化了,所以不能再例項,直接返回已有的物件}}

/*方法2:

* 此方法在單執行緒中完全沒問題

* 在多執行緒中可能會有問題,例如兩個執行緒同時訪問,並同時執行到判斷instance==null語句

* 那麼兩個執行緒返回的結果都是true的話,則instance=new singleton2;語句就會執行2次,

* 當然這種概率特別低,但也不能排除此可能性。

* * 此外這種方式比較省資源,因為如果不訪問instance屬性的情況下,instance永遠為空。

*/public

sealed

class

singleton2

public

static

singleton2 instance //無論在**,用到singleton.instance,其值都一樣。}}

/*方法3:

* 此方法在單執行緒和多執行緒中都沒問題。因為靜態變數在編譯後就會生成唯一的instance,使用

* 不會再生成,所以它們訪問的永遠是同乙個instance。

* * 此外這種方式比較浪費資源。無論你用不用getinstance方法,instance都早已有值。

*/public

sealed

class

singleton3

//私有建構函式,避免使用者使用new

public

static

singleton3

getinstance()

//開放乙個全域性訪問點,返回當前的instance,且為唯一

}

C 設計模式(一) 單例模式

單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。主要解決 乙個全域性使用的類頻繁地建立與銷毀。何時使用 想控制例項數目,節省系統資源的時候。如何解決 判斷系統是否已存在單例,如果有則返回,沒有則建立。關鍵 建構函式是私有的。單例大約有兩種實現方法 懶漢與餓漢。懶漢 故名思義,不到萬...

C 設計模式 一 單例模式

c 單例模式也稱為單件模式 單子模式。使用單例模式,保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。有很多地方需要這樣的功能模組,如系統的日誌輸出等。單例模式有許多種實現方法,a.懶漢式 使用的時候才建立,多執行緒訪問的時候執行緒不安全 雙檢鎖 b.餓漢式 類檔案載...

C 設計模式(一) 單例模式

1,單利模式 保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,使得系統中只有唯一的乙個物件例項。應用 常用於管理資源,如日誌,執行緒池 實現要點 在類中,要構造乙個例項,就必須呼叫類的建構函式,並且為了保證全域性只有乙個例項。需防止在外部呼叫類的建構函式而構造例項,需要將建構函式的訪問許可權...