介紹 很多有著不同開發背景得人都會比較熟悉單例模式
他們會發現每次他們要創建一個不同的單例類的時候
都不得不寫同樣得代碼
使用新的C#
的泛型
可以實現只寫一次同樣得代碼
背景
已經有很多文章介紹過單例模式
也許最完整的一個C#版本在這裡可以找到:
Implementing the Singleton Pattern in C#
也有越來越多介紹C#泛型得文章
例如
一篇由CodeProject的Ansil所寫的文章可以在這裡找到:
Generics in C#
使用 C#
泛型來完成單例模式的重用
使用 C#
的泛型
使得實現我所說的
單例提供者
成為可能
這是一個可用來創建單例類實例確不需要為每個特定的類重寫單例模式代碼的可重用的類
這樣分離出單例結構的代碼
將有利於保持按單例模式使用類或不按單例模式使用類的靈活性
在這裡使用的單例的代碼是基於文章上面提到過的
Implementing the Singleton Pattern in C#
文章裡的第五個版本實現的
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return SingletonCreatorinstance;
}
}
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 where T : new()
{
SingletonProvider() { }
public static T Instance
{
get { return SingletonCreatorinstance; }
}
class SingletonCreator
{
static SingletonCreator() { }
internal static readonly T instance = new T();
}
}
注意在這裡使用了泛型的約束這個約束強制任何類型t都必須具有無參數的公共構造函數這裡允許singletoncreator類來實例化類型t
那麼要怎麼樣來使用單例提供者呢?為了弄清除如何使用它我們需要寫一個測試類這個測試類有兩個部分第一部分是一個默認的構造函數用來設置timestamp變量的值第二部分是一個公共函數用來實現用debugwriteline來輸出timestamp的值這個測試類的意思就是不論那個線程在任何時候在單例下調用這個類公共方法都將返回相同的值
public class TestClass
{
private string _createdTimestamp;
public TestClass ()
{
_createdTimestamp = DateTimeNowToString();
}
public void Write()
{
DebugWriteLine(_createdTimestamp);
}
}
這個類就像下面這樣使用單例提供者
SingletonProviderInstanceWrite();
關注點
我已經在一個超線程的雙處理器上使用個線程在單態模式下進行了測試所有線程都返回相同的值這說明這是一個線程安全的使用泛型來實現的單態模式
我相信這已經充分說明了泛型怎麼幫助你簡化代碼
From:http://tw.wingwit.com/Article/program/net/201311/11650.html