zoukankan      html  css  js  c++  java
  • 使用泛型实现单例模式提供者

        MSDN 上有解释泛型是什么: C#泛型简介 。今天我就用泛型重构我的代码。以前每个类的单例模式是这么写的:

    以前的单例模式代码
    public class myClass
    {
        
    public myClass(){}
        
    private static myClass m_instance = null;
        
    private static object sync = new object();
        
    public static myClass Instance
        {
            
    if(m_instance == null){
                
    lock(sync){
                    m_instance 
    = new myClass();
                }
            }
            
    return m_instance;
        }
    }

         要是每个类都有这么段代码,该如何.....我能不能将其抽出来为一个公共方法? 有了泛型的基础,我们很容易地做到。以下是泛型的单例提供者,它要求类必须实现一个可以 new 的对象:

    泛型单例的实现
    /// <summary>
        
    /// 单例模式
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        public class SingletonProvider<T> where T : new()
        {
            
    private static T m_instance;
            
    private static readonly object sync = new object();
            
    private SingletonProvider() { }

            
    /// <summary>
            
    /// 用法:SingletonProvider<myclass>.Instance 获取该类的单例 
            
    /// </summary>
            public static T Instance
            {
                
    get
                {
                    
    if (m_instance == null)
                    {
                        
    lock (sync)
                        {
                            
    if (m_instance == null)
                            {
                                Console.WriteLine(
    "创建了一个对象 ");
                                m_instance 
    = new T();
                            }
                        }
                    }
                    
    return m_instance;
                }
            }
        }

         下面我新建一个测试类:
    测试类
    class SingletonTest
        {
            
    public SingletonTest() { }

            
    public string Name
            { 
    getset; }

            
    public void Show() {
                Console.WriteLine(
    "{0} 呼叫 {1}", DateTime.Now, Name);
            }
        }

         主程序中调用方法:
    主程序调用
        class Program
        {
            
    static void Main(string[] args)
            {
                SingletonProvider
    <SingletonTest>.Instance.Name = "感恩的心";
                SingletonProvider
    <SingletonTest>.Instance.Show();

                SingletonProvider
    <SingletonTest>.Instance.Name = "infozero@163.com";
                SingletonProvider
    <SingletonTest>.Instance.Show();
                Console.Read();
            }
        }

     
         运行结果如下:



         个人的一点体会:泛型是将类型参数化,它是将指定的类型推迟到客户端实现,有点类似于 模板方法。

  • 相关阅读:
    python全栈开发_day48_bootstrap
    python全栈开发_day47_js,jQuery
    python全栈开发_day46_html文本标签
    抽象集合
    ViewState的用法
    sql(join中on与where区别)
    微软的技术文档链接地址
    微软的帮助文档,详细的介绍VS开发工具的使用
    [摘录]解决C# DateTime去掉时分秒几种方法
    验证(摘录)
  • 原文地址:https://www.cnblogs.com/infozero/p/1770753.html
Copyright © 2011-2022 走看看