单件模式

 1、基本概述设计模式

单件模式:确保一个类只有一个实例,并提供一个全局访问点。安全

解析以下:ide

  1)首先,该Singleton的构造函数必须是私有的,以保证客户程序不会经过new()操做产生一个实例,达到实现单例的目的;函数

  2)由于静态变量的生命周期跟整个应用程序的生命周期是同样的,因此能够定义一个私有的静态全局变量uniqueInstance来保存该类的惟一实例;性能

  3)必须提供一个全局函数访问得到该实例。spa

以下图结构说明图:线程

 

2、详细说明设计

单件模式的建立,有三种方式。code

  1. 使用经典方式,存在一个问题,当有多个线程同时访问时,会建立多个实例,违反了单件的本意。
  2. 使用急切方式,若是应用程序老是建立并使用单件实例,或者在建立和运行时方面的负担不太繁重,该方式可使用。它的初始化交由静态构造函数实现,并能够在运行时编译。在这种模式下,无需本身解决线程安全性问题,CLR会给咱们解决。由此能够看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出惟一的单例对象。
  3. 使用懒惰(双重检查加锁)方式,首先检查是否实例已经建立,若是还没有建立,“才”进行同步。这样一来,只有第一次会同步,同步中会再检查是否实例已经建立。若是性能是你关心的重点,那么这个作法能够帮你大大地减小GetInstance()的时间耗费。

问:难道我不能建立一个类,把全部的方法和变量都定义为静态的,把类直接看成一个单件?对象

答:若是你的类自给自足,并且不依赖于复杂的初始化,那么你能够这么作。可是,由于静态初始化的控制权是在CLR手上,这么作有可能致使混乱,特别是当有许多类牵涉其中的时候。这么作经常会形成一些微妙的、不容易发现的和初始化的次序有关的bug。除非你有绝对的必要使用类的单件,不然仍是建议使用对象的单件,比较保险。

 

问:我仍是不了解为什么全局变量比单件模式差。

答:在.Net中,全局变量基本上就是对对象的静态引用。在这样的状况下使用全局变量会有一些缺点,咱们已经提到了其中的一个,急切实例化VS延迟实例化。可是咱们要记住这个模式的目的,确保类只有一个实例并提供全局访问。全局变量能够提供全局访问,可是不能确保只有一个实例。

3、代码列表

public class Singleton
{
    //其余有用的单件数据

    private Singleton()
    {
    }

    //方式一:经典方式
    /*private static Singleton uniqueInstance;
    public static Singleton GetInstance()
    {
        if (uniqueInstance == null)
        {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }*/

    //方式二:急切方式
    /*private static Singleton uniqueInstance = new Singleton();
    public static Singleton GetInstance()
    {
        return uniqueInstance;
    }*/

    //方式三:双重检查加锁方式
    /*private static Singleton uniqueInstance;
    public static Singleton GetInstance()
    {
        if (uniqueInstance == null)
        {
            lock (uniqueInstance)
            {
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
        //Interlocked类为多个线程共享的变量提供原子操做。
        //CompareExchange方法比较两个对象是否相等,若是相等,则替换其中一个对象。
        //return Interlocked.CompareExchange(ref uniqueInstance, new Singleton(), null);
    }*/

    //其余有用的单件方法
}
View Code

---------------------------------以上内容根据《Head First 设计模式》进行整理

相关文章
相关标签/搜索