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