首先,单例模式属于创建性模式之一,主要解决的问题是如何创建对象,获得产品,保证一个类只有一个实例,并提供一个访问它的全局访问点。
单例模式的结构很简单,只需要一个类就可以完成。
基础的C#代码
Public Singleton
{
private static Singleton instance;
private Singleton(){} //将构造函数私有化,避免外界利用new来创建实例
public static Singleton GetInstance(){ //此方法是获得本类实例的唯一全局访问点
if(instance==null) //若实例不存在new出新实例
{
instance=new Singleton();
}
Return instance;
}
}
当面对多线程问题,当多个线程同时访问Singleton类,调用GetInstance()方法,会可能导致创建多个实例。这时,就要将线程加锁,保证一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到对象被释放。
Public 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;
}
}
}
关于继承的问题:如果有别的类可以继承单例类的话。单例类将失去作用,因为当有类继承单例的时候,继承类拥有GetInstance方法,这时候,单例的访问点就会增多,打破了单例类的原则。