參考資料:
【譯】在c#中實現單例模式
c#設計模式(1)——單例模式
單例模式的優缺點和使用場景
確保乙個類只有乙個例項
提供了乙個全域性訪問點
通過自己建立唯一例項
對外所有訪問物件都提供乙個唯一例項。
1)執行緒不安全
public
class
singleton
public
static
singleton
getinstance()
return singleton;}}
}
缺點:上述內容是執行緒不安全的,再多執行緒的情況寫會得到多個singleton例項。因為兩個執行緒同時執行時,此時 (singleton == null)都返回true的話,就會生成兩個例項,顯然違反了單例模式的規則。(不要使用)
2)簡單的執行緒安全(也較常用)
public
class
singleton
public
static
singleton
getinstance()
}return singleton;}}
}
該實現是執行緒安全的。但是每次請求例項都會獲得鎖定,因此會對效能有所影響。
當第一次建立了該例項之後,後面的執行緒只需要直接判斷該例項是否為null,此時完全沒有必要加鎖,所以上面的實現方式增加了額外的開銷,損失了效能。
該實現方式也比較常用,雖然它看起來會因加鎖耗時,但是實際上執行起來並沒有想象中的那麼慢
3)使用雙重檢查鎖定保證執行緒安全
public
class
singleton
public
static
singleton
getinstance()
}}return singleton;
}}
該是顯示執行緒安全的,而且不必每次都取出鎖。
效能不如後續(原因???)
該行是否多餘?
這句**是不能省的,兩個執行緒同時執行lock外層的if (singleton == null),都成立,第一條執行緒加鎖例項化乙個物件,解鎖後,如果不加判斷,第二條執行緒直接例項化乙個物件,這就不是單例了。
4)不使用鎖的執行緒安全(常用)
public
class
singleton
private
singleton()
public
static
singleton
getinstance()
}}
由clr保證,在程式第一次使用該類之前被呼叫,而且只呼叫一次 。
缺點: 在程式初始化後, 靜態物件就被clr構造了, 哪怕你沒用。
5)使用lazy型別
public
class
singleton
public
static
singleton
getinstance()
}}
如果你使用的是.net4或其以上版本,可以使用system.lazy
type來實現完全懶漢式。其**看起來也很簡潔且效能表現也很好
1)外部資源:每台計算機有若干個印表機,但只能有乙個printerspooler,以避免兩個列印作業同時輸出到印表機
2)內部資源:大多數軟體都有乙個或(多個)屬性檔案存放系統配置,這樣的系統應該有乙個物件管理這些屬性檔案
3)windows的task manager(任務管理器)就是很典型的單例模式(這個很熟悉吧)想想看,是不是呢,你能開啟兩個windowstask manager嗎? 不信你自己試試看哦~
4)**的計數器,一般也是採用單例模式實現,否則難以同步。
5)web應用的配置物件的讀取,一般也應用單例模式,這個是由於配置檔案是共享的資源。
6)資料庫連線池的設計一般也是採用單例模式,因為資料庫連線是一種資料庫資源。資料庫軟體系統中使用資料庫連線池,主要是節省開啟或者關閉資料庫連線所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因為何用單例模式來維護,就可以大大降低這種損耗。
7)多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池要方便對池中的執行緒進行控制
設計模式 C 設計模式 單例模式
設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...
C 設計模式 (單例模式)
單例模式 顧名思義,只有乙個物件例項,即保證乙個類只有乙個物件可以使用。作用類似於乙個全域性變數,可以任意呼叫,但是比全域性變數更容易管理,使用。單例模式也有很多種實現方式 第一種實現方法 h檔案 class csock test public casyncsocket cpp檔案 csock te...
設計模式 單例模式(c )
在gof 設計模式 中,單例模式的定義為 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。下面是單例模式的c 實現 方案一 建構函式和拷貝建構函式一定要宣告為private 定義static成員 單例指標和獲取單例指標的函式 static單例指標要在類外定義並初始化 實現獲取單例指標的函式時...