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();
            }
        }

     
         运行结果如下:



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

  • 相关阅读:
    storage存储对象和数组类型时候的问题
    关于vue-router路径配置的问题
    解决v-for产生的警告的办法
    网页调用打印机打印文件
    vue-router的link样式设置问题
    在vue项目当中使用sass
    使用正则获取地址栏参数的方法
    escape、encodeURI和encodeURIComponent的区别
    SQLServer安装错误之--->无法打开项 UNKNOWNComponentsDA42BC89BF25F5BD0AF18C3B9B1A1EE8c1c4f01781cc94c4c8fb1542c0981a2a
    软件收集网站!
  • 原文地址:https://www.cnblogs.com/infozero/p/1770753.html
Copyright © 2011-2022 走看看