使用泛型实现单例提供者(原创翻译)
?
原文標題:Generic Singleton Provider
原文地址:http://www.codeproject.com/csharp/genericsingleton.asp
介紹
很多有著不同開發背景得人都會比較熟悉單例模式。他們會發現每次他們要創建一個不同的單例類的時候,都不得不寫同樣得代碼。使用新的C# 2.0的泛型,可以實現只寫一次同樣得代碼。
背景
已經有很多文章介紹過單例模式,也許最完整的一個C#版本在這里可以找到:"Implementing the Singleton Pattern in C#"。
也有越來越多介紹C#泛型得文章。例如,一篇由CodeProject的Ansil所寫的文章可以在這里找到:"Generics in C# 2.0" 。
使用 C# 2.0 泛型來完成單例模式的重用
使用 C# 2.0 的泛型,使得實現我所說的"單例提供者"成為可能。這是一個可用來創建單例類實例確不需要為每個特定的類重寫單例模式代碼的可重用的類。這樣分離出單例結構的代碼,將有利于保持按單例模式使用類或不按單例模式使用類的靈活性。
在這里使用的單例的代碼是基于文章上面提到過的"Implementing the Singleton Pattern in C#"文章里的第五個版本實現的。
{
????Singleton()
????{
????}
????public?static?Singleton?Instance
????{
????????get
????????{
????????????return?SingletonCreator.instance;
????????}
????}
????
????class?SingletonCreator
????{
????????//?Explicit?static?constructor?to?tell?C#?compiler
????????//?not?to?mark?type?as?beforefieldinit
????????static?Nested()
????????{
????????}
????????internal?static?readonly?Singleton?instance?=?new?Singleton();
????}
}
基于對泛型的了解,你可以發現沒有理由不在這段代碼里替換類型參數為泛型里典型的'T'。如果這樣做,這段代碼就變成下面這樣。
public?class?SingletonProvider<T>?where?T?:?new()
{
????SingletonProvider()?{?}
????public?static?T?Instance
????{
????????get?{?return?SingletonCreator.instance;?}
????}
????class?SingletonCreator
????{
????????static?SingletonCreator()?{?}
????????internal?static?readonly?T?instance?=?new?T();
????}
}
注意在這里使用了泛型的約束。這個約束強制任何類型'T'都必須具有無參數的公共構造函數。這里允許singletonCreator類來實例化類型'T'。
那么,要怎么樣來使用單例提供者呢?為了弄清除如何使用它,我們需要寫一個測試類。這個測試類有兩個部分。第一部分是一個默認的構造函數,用來設置timestamp變量的值。第二部分是一個公共函數,用來實現用"Debug.WriteLine"來輸出timestamp的值。這個測試類的意思就是不論那個線程在任何時候,在單例下調用這個類公共方法,都將返回相同的值。
{
????private?string?_createdTimestamp;
????public?TestClass?()
????{
????????_createdTimestamp?=?DateTime.Now.ToString();
????}
????public?void?Write()
????{
????????Debug.WriteLine(_createdTimestamp);
????}
}
這個類就像下面這樣使用單例提供者:
SingletonProvider<TestClass>.Instance.Write();關注點
我已經在一個超線程的雙處理器上使用100個線程在單態模式下進行了測試。所有線程都返回相同的值,這說明這是一個線程安全的使用泛型來實現的單態模式。
我相信這已經充分說明了泛型怎么幫助你簡化代碼。
歷史
略。
轉載于:https://www.cnblogs.com/justinw/archive/2006/05/07/393076.html
總結
以上是生活随笔為你收集整理的使用泛型实现单例提供者(原创翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用好索引器。
- 下一篇: 分享我做的博客园Skin(目前12个,最