设计模式-2、单例模式

来源:互联网 发布:淘宝图片放大镜功能 编辑:程序博客网 时间:2024/05/24 07:12

单例模式,也是非常好理解的一种设计模式。
单例,也叫单件,目的是为了保证一个类只有一个实例。当然,没使用上单例模式的时候,在代码实现时候,注意不要随便new某个对象,这…..的确可以,但很不安全。因此简单代码一处理,一个单例模式便出来了。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _2_单例模式{    public class SingletonInfo    {        private static SingletonInfo info = null;        private SingletonInfo() { }        public static SingletonInfo GetInfo()        {            if (null == info)            {                info = new SingletonInfo();            }            return info;        }    }    class Program    {        static void Main(string[] args)        {            // SingletonInfo info = new SingletonInfo();因为构造函数是私有的,所以编译器不给new            SingletonInfo info = SingletonInfo.GetInfo();//这样就能基本保证SingletonInfo类只有一个实例,前提是没有多线程        }    }}

上边的写法叫做懒汉模式,所谓懒,就是没到用它的那天,它都不肯生成个实际出来,以节约资源。然而还有另外一种差不多的写法,叫饿汉模式,则系统始终阶段它便有那么一个实际。实际上就只稍做改变

    public class EagerSingletonInfo    {        private static EagerSingletonInfo info = new EagerSingletonInfo();//它 的静态实例,始终阶段就new出来了        private EagerSingletonInfo() { }        public static EagerSingletonInfo GetInfo()        {            return info;        }    }

另外,第一段代码中还提及到所写的单例只针对没有多线程的情况,面对多线程,有较小的概率还是会不安全的。

        public static SingletonInfo GetInfo()        {            if (null == info)            {//如果两个或以上的线程同时跑到这里来,就不止得一个实例了                info = new SingletonInfo();            }            return info;        }

解决起来也无非加锁,做法常规则,只不过lock在开发中的不多用。

    public class SingletonInfo    {        private static SingletonInfo info = null;        private static object objHelpless = new object();//制造个没实际作用的对象出来,只为加锁        private SingletonInfo() { }        public static SingletonInfo GetInfo()        {            if (null == info)//先不加锁判断下,如果它本身非空,每次都锁着判断,性能会下降了点            {                lock (objHelpless)                {                    if (null==info)//这时候带锁判断,安全可靠                    {                        info = new SingletonInfo();                    }                }            }            return info;        }    }

现实中,用到单例模式的地方也不少,例如:web中的application、windows中的任务管理器、回收站。这些功能均需要保证只有一个实际的存在。

0 0
原创粉丝点击