单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,类的实例都只存在一个(当然也可以不存在),并提供一个访问全局点。
单例模式的特点:
单例模式使类在程序生命周期的任何时刻都只有一个实例;
单例的构造函数是私有的,外部程序如果想要访问这个单例类的话,必须通过请求(GetInstance()等)来得到这个单例类的实例。
适用性
• 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
• 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
很多模式可以使用Singleton模式实现。参见Abstract Factory(3.1)、Builder(3.2),和Prototype(3.4)。Facade模式(称为单例外观);
/// <summary> /// 懒汉式单例模式 /// Summary description for Spooler. /// </summary> public class Spooler { private static bool instance_flag= false; private Spooler() { instance_flag = true; } //简单模式 public static Spooler getSpooler() { if (! instance_flag) return new Spooler (); else return null; } private static Spooler m_instanceSpooler; private static readonly object m_objectPadLock = new object(); public static Spooler InstanceSpooler { get { //并不是线程安全的,在多线程模式下,可能产生第二个实例 //return m_instance == null ? new RectangleMethod() : m_instance; //采用双锁定技术 if (m_instanceSpooler == null) { lock (m_objectPadLock) { if (m_instanceSpooler == null) m_instanceSpooler = new Spooler(); } } return m_instanceSpooler; } } } /// <summary> ///饿汉式单例类----静态初始化创建单件,保证了线程安全 /// </summary> public sealed class Singleton { private static readonly Singleton singleton = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return singleton; } }