设计模式之单例模式

在程序中如果希望某一个对象(类或者是窗体等任何的对象)只创建一次也就是至始至终使用同一个实例,那么我们就会用到了单例模式,对于单例模式有两种方式可以实现:

1.私有构造函数+私有静态对象实例+公有访问方法

  class MySingle
    {
        //控制线程加锁对象
        private static readonly object obj = new object();
        //私有对象实例
        private static MySingle instance;
        /// <summary>
        /// 私有构造函数
        /// </summary>
        private MySingle()
        {
        }

        /// <summary>
        /// 共有访问函数
        /// </summary>
        /// <returns></returns>
        public static MySingle GetInstance()
        {
            if (instance == null)
            {
                lock (obj)
                {
                    if (instance == null)
                    {
                        instance = new MySingle();
                    }
                }
            }
            return instance;
        }
    }

使用方法:

 MySingle single = MySingle.GetInstance();

 只所以添加lock判断是防止多线程的时候同样是可以创建多个对象的,另外为了防止每次代码都执行lock这样耗费性能的代码,所以仅在对象为空的时候才进行lock锁。

2.私有构造函数+公有静态对象实例(次方法和方法1本质一样)

   class MySingle
    {
        //控制线程加锁对象
        private static readonly object obj = new object();
        private static MySingle _instance;
        public static MySingle Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (obj)
                    {
                        if (_instance == null)
                        {
                            _instance = new MySingle();
                        }
                    }
                }
                return _instance;
            }
        }
        /// <summary>
        /// 私有构造函数
        /// </summary>
        private MySingle()
        {
        }
    }

同样私有构造函数,然后使用了一个public的对象替代了方法1中的公有函数,感觉这样在使用起来更方便,其他没有做变动,使用方法:

  MySingle single1 = MySingle.Instance;

 3.密封类+私有静态只读对象实例+公有方法

 sealed class MySingle
    {
        private static readonly MySingle _instance=new MySingle ();
     
        /// <summary>
        /// 私有构造函数
        /// </summary>
        private MySingle()
        {
        }

        public static MySingle GetInstance()
        {
            return _instance;
        }
    }

定义密封类是防止派生其他类,而派生类可能会增加实例;使用readonly作为对象修饰符保证了对象只在第一次创建对象时候执行。

当然,上述只是提出了比较常用的形式实现单例模式,大家有更好的可以互相交流。

原文地址:https://www.cnblogs.com/ListenFly/p/3204262.html