介绍 很多有着不同开发背景得人都会比较熟悉单例模式他们会发现每次他们要创建一个不同的单例类的时候都不得不写同样得代码使用新的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(); 关注点 我已经在一个超线程的双处理器上使用个线程在单态模式下进行了测试所有线程都返回相同的值这说明这是一个线程安全的使用泛型来实现的单态模式 我相信这已经充分说明了泛型怎么帮助你简化代码 |