• 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

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

    作者:BangQ

    http://www.cnblogs.com/BangQ/

     

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    说明:本文以“现状”提供且没有任何担保,同时也没有授予任何权利。 | This posting is provided "AS IS" with no warranties, and confers no rights.
    珍爱生命,Leave here!
  • 相关阅读:
    execl csv导出
    input里面check 状态检测
    注意这种方法的判断
    本周,上周,本月,上月
    bootstrap 兼容IE8设置
    js jquery 验证写法
    Jquery radio checked
    最简单的XML转数组
    eq,neq,gt,lt等表达式缩写
    python中的注释
  • 原文地址:https://www.cnblogs.com/BangQ/p/2322768.html
Copyright © 2020-2023  润新知