设计模式6-单例模式

时间:2021-07-25 22:00:12

  单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

  直接代码:

public class Singleton
    {
        //作用:private 私有化 让外部不能访问。static 静态 
        //让实例对象一直存在程序内存,在程序运行时不被回收
        private static Singleton instance;

        //静态构造函数:让类无法在外部实例化
        private Singleton() { }

        //函数:返回对象的实例,提供类实例的唯一访问点
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
   

   一个简单的单例模式就这样了,当然在多线程程序中这样是不行的,所有进行修改:

 //程序运行时创建一个静态辅助只读的进程辅助对象 用于加锁
        private static readonly object syncRoot = new object();
        public static Singleton GetInstance2()
        {
            //判断Instance是否存在,不存在再加锁处理
            if (instance == null)
            {
                //加锁
                lock (syncRoot)
                {
                    //第二次判断 是应为 多线程中 可能有在
                    //对象不存在的情况下 有多个线程已经通过了第一次判断,
                    //在锁处排队等候进入,没有判断将可能产生多个实例
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }

  当然了,还有另一种方式,不需要显示的编写线程安全的代码:

//sealed 阻止发生派生,派生可能增加实例
    public sealed class Singleton
    {
        //在第一次引用类的任何成员时创建实例,公共语言运行库付租处理变量的初始化
        private static readonly Singleton instance = new Singleton();
        private Singleton() { }
        public static Singleton GetInstance()
        {
            return instance;
        }
    }

单例模式就这些内容了。

PS:没啥自己的理解,晕乎乎的,还是不该勉强哦。