设计模式之单例模式

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

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作为对象修饰符保证了对象只在第一次创建对象时候执行。

 

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

你可能感兴趣的:(设计模式)