使用泛型实现单例提供者(原创翻译)
?
原文標(biāo)題:Generic Singleton Provider
原文地址:http://www.codeproject.com/csharp/genericsingleton.asp
介紹
很多有著不同開發(fā)背景得人都會(huì)比較熟悉單例模式。他們會(huì)發(fā)現(xiàn)每次他們要?jiǎng)?chuàng)建一個(gè)不同的單例類的時(shí)候,都不得不寫同樣得代碼。使用新的C# 2.0的泛型,可以實(shí)現(xiàn)只寫一次同樣得代碼。
背景
已經(jīng)有很多文章介紹過單例模式,也許最完整的一個(gè)C#版本在這里可以找到:"Implementing the Singleton Pattern in C#"。
也有越來越多介紹C#泛型得文章。例如,一篇由CodeProject的Ansil所寫的文章可以在這里找到:"Generics in C# 2.0" 。
使用 C# 2.0 泛型來完成單例模式的重用
使用 C# 2.0 的泛型,使得實(shí)現(xiàn)我所說的"單例提供者"成為可能。這是一個(gè)可用來創(chuàng)建單例類實(shí)例確不需要為每個(gè)特定的類重寫單例模式代碼的可重用的類。這樣分離出單例結(jié)構(gòu)的代碼,將有利于保持按單例模式使用類或不按單例模式使用類的靈活性。
在這里使用的單例的代碼是基于文章上面提到過的"Implementing the Singleton Pattern in C#"文章里的第五個(gè)版本實(shí)現(xiàn)的。
{
????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();
????}
}
基于對(duì)泛型的了解,你可以發(fā)現(xiàn)沒有理由不在這段代碼里替換類型參數(shù)為泛型里典型的'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();
????}
}
注意在這里使用了泛型的約束。這個(gè)約束強(qiáng)制任何類型'T'都必須具有無(wú)參數(shù)的公共構(gòu)造函數(shù)。這里允許singletonCreator類來實(shí)例化類型'T'。
那么,要怎么樣來使用單例提供者呢?為了弄清除如何使用它,我們需要寫一個(gè)測(cè)試類。這個(gè)測(cè)試類有兩個(gè)部分。第一部分是一個(gè)默認(rèn)的構(gòu)造函數(shù),用來設(shè)置timestamp變量的值。第二部分是一個(gè)公共函數(shù),用來實(shí)現(xiàn)用"Debug.WriteLine"來輸出timestamp的值。這個(gè)測(cè)試類的意思就是不論那個(gè)線程在任何時(shí)候,在單例下調(diào)用這個(gè)類公共方法,都將返回相同的值。
{
????private?string?_createdTimestamp;
????public?TestClass?()
????{
????????_createdTimestamp?=?DateTime.Now.ToString();
????}
????public?void?Write()
????{
????????Debug.WriteLine(_createdTimestamp);
????}
}
這個(gè)類就像下面這樣使用單例提供者:
SingletonProvider<TestClass>.Instance.Write();關(guān)注點(diǎn)
我已經(jīng)在一個(gè)超線程的雙處理器上使用100個(gè)線程在單態(tài)模式下進(jìn)行了測(cè)試。所有線程都返回相同的值,這說明這是一個(gè)線程安全的使用泛型來實(shí)現(xiàn)的單態(tài)模式。
我相信這已經(jīng)充分說明了泛型怎么幫助你簡(jiǎn)化代碼。
歷史
略。
轉(zhuǎn)載于:https://www.cnblogs.com/justinw/archive/2006/05/07/393076.html
總結(jié)
以上是生活随笔為你收集整理的使用泛型实现单例提供者(原创翻译)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用好索引器。
- 下一篇: 雷军亲自宣传自家“外星科技”:Redmi