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