”通常情况下我们可以让一个全局变量使得一个对象被访问,但不能防止你实例化多个对象,一个最好的方法就是,让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。“
一、经典单例
public class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
Singleton类,定义一个GetInstance()操作,允许客户访问他的唯一实例。
说明:1.构造方法为private这样就保证了外界通过new来创建这个类的实例的可能;
2.因为静态变量的生命周期和整个应用程序的生命周期是一样的,故定义一个private的静态变量来存储唯一实例。
二、多线程下的单例
多线程同时访问Singletion类调用GetInstance()操作时候会可能创建多个实例,对待这种情况我们需要加锁处理
public 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)
{
instance=new Singleton();
}
}
}
return instance;
}
}
说明:1.外层if()保证只有在实例未被创建的时候在加锁处理;
2.内层if()确保实例不被重复创建
三、静态初始化单例(饿汉模式)
public sealed class Singleton
{
private static readonly Singleton instance=new Singleton();
private Singleton(){}
public static Singleton GetInstance()
{
return instance;
}
}
说明 1.sealed 阻止其他类继承Singleton防止增加实例
2.readonly修饰instance 意味着类一加载就实例化对象,这样就由公共语言运行库负责变量初始化,我们无须考虑安全问题