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

使用C2.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模式的这一的线程被称为公共方法应该输出相同的值


 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

这是第一次迭代此代码有任何问题可以向我反馈

posted @ 2012-01-15 10:32  BangQ  阅读(443)  评论(0编辑  收藏  举报