首页 > 代码库 > 【面向对象】——设计模式之单例模式

【面向对象】——设计模式之单例模式


单例模式:

         定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

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

技术分享

 GetInstance是一个静态方法,主要负责创建自己的唯一实例,然后允许客户访问它的唯一实例。

         多线程时的单例:解决的是同时访问Singleton类,可能造成创建多个实例的问题。

         为了解决这个问题,可以给进程加把锁,lock,确保当一个线程位于代码的临界区时,另一个线程不进入临界区,如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。

          class Singleton
    {
        private static Singleton instance;
        private static readonly object syncRoot = new object();
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            if (instance == null)   //一重:先判断实例是否存在,再决定是否加锁
            {
                lock (syncRoot)
                {
                    if (instance == null)//二重:由于lock,只有一个可进入此,当一个将其实例化,则其它无必要再进入。同时避免多个实例化。
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

         这即双重锁定

         另外解决多线程,还有一个实现更简单的方法:静态初始化:

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

像静态初始化,在自己被加载时就将自己实例化,这种方式被称为:饿汉式单例类。而像前面的单例模式,要在第一次被引用时,才将自己实例化,这种方式被称为:懒汉式单例类

饿汉式是类一加载就实例化的对象,所以要提前占用系统资源。然而懒汉式,又会面临多线程访问的安全性问题。所以需用哪种模式,还需根据实际情况。

        简言之:单例就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

【面向对象】——设计模式之单例模式