Generic Singleton Provider
原文链接:http://www.codeproject.com/KB/cs/genericsingleton.aspx
Introduction
很多人通过各种途径各种编程背景了解了Singleton(单例)模式。但是呢,每次使用单例都要写很多相同的代码,着实蛋疼。自从有了泛型之后,就可以不这么蛋疼了。这篇文章介绍使用泛型创建单例的Provider
Background
有许多关于(Singleton)单例模式的文章. 这有个可能是最全面的了: "Implementing the Singleton Pattern in C#".
也有很多人使用泛型编写单例,例如codeproject上的这一篇:"Generics in C# 2.0" by Ansil.
Using C# 2.0 Generics to achieve a reusable Singleton pattern
使用C#2.0泛型,它是可以创造我所说的一个“单身人士提供者”。这是一个可以反复使用,而无需重新写特定类的Singleton模式的代码实例化一个类作为一个单身类。这已经单身代码分离类代码留下灵活地使用类的几个实例,或使用类作为一个单身的额外的好处。
单身在这个例子中使用的代码是基于在有关实现Singleton模式在C#中的上述文章中所描述的第五个例子: Collapse | Copy Code
public sealed class Singleton {
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”类型。
那么,如何使用SingletonProvider?要了解如何使用此,我们需要一个测试类。测试类有两个特点。第一个是默认的构造函数,设置一个时间戳成员变量。第二个是一个公共方法写入时间戳使用Debug.WriteLine。此设置意味着,无论使用Singleton模式的这一类的线程,被称为公共方法时,应该输出相同的值。
那么,如何使用SingletonProvider?要了解如何使用此,我们需要一个测试类。测试类有两个特点。第一个是默认的构造函数,设置一个时间戳成员变量。第二个是一个公共方法写入时间戳使用Debug.WriteLine。此设置意味着,无论使用Singleton模式的这一类的线程,被称为公共方法时,应该输出相同的值。
Collapse | Copy Code
public class TestClass
{
private string _createdTimestamp;
public TestClass ()
{
_createdTimestamp = DateTime.Now.ToString();
}
public void Write()
{
Debug.WriteLine(_createdTimestamp);
}
}
下面是SingletonProvider
的使用:
SingletonProvider<TestClass>.Instance.Write();
Points of Interest
这个例子程序在双核cpu的机器上开了100个线程,测试很ok. 他们输出的值相同,说明这个单例提供程序是很安全
我相信这个单例可以给你带来很多便利。谢谢您的阅读
History
这是第一次迭代此代码,有任何问题可以向我反馈!
作者:BangQ
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
说明:本文以“现状”提供且没有任何担保,同时也没有授予任何权利。 | This posting is provided "AS IS" with no warranties, and confers no rights.
珍爱生命,Leave here!
说明:本文以“现状”提供且没有任何担保,同时也没有授予任何权利。 | This posting is provided "AS IS" with no warranties, and confers no rights.
珍爱生命,Leave here!