c#面向对象设计模式纵横谈--Singleton单件(创建型模式)
Singleton单件是一种比较简单的创建型模式。模式从目的来看可以分为三类:第一类是创建型应用模式,主要负责对象的创建;第二类是结构型应用模式,用来处理类与对象之间的组合;第三类是行为型应用模式,用来处理类与对象之间的职责分配。从范围来看,类模式用来处理类与子类的静态关系,而对象模型用来处理对象间的动态关系。
Singleton模式的动机是在软件系统中, 经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率。设计模式的意图是保证一个类仅有一个实例,并且提供一个该实例的全局访问点。
下面是单线程下的一个Singleton的代码实例:
public class Singleton
{
private static Singleton instance;
private Singleton(){ };
public static Singleton Instance
{
get{
if(instance=null)
{
instance = new Singleton();
}
return instance;
}
}
}
class Test
{public static void Main(){
Singleton t1 = Singleton.Instance;
Singleton t2 = Singleton.Instance;
Console.Writeline(Object.ReferenceEquals(t1,t2)==true); //这一句是用来测试两个实例的引用是否相等。
}}
而多线程下singleton模式的实现如下所示:
Class Singleton
{
private static volatile Singleton instance=null;//volatile在编译是不进行微调
private static object lockHelper=new Object();
private Singleton()//私有构造器,使得Singleton 只可以在本类的内部被创建
{
}
public static Singleton Instance
{
get
{
if(instance==null)
{
lock(lockHelper)//这里采用double check方式
{
if(instance==null)//避免了两个线程产生两个实例的危险
{
}
}
}
return instance;
}
}
多线程Singleton Pattern的一种更好的方式:
class Singleton
{
public static readonly Singleton Instance=new Singleton();
private Singleton()
{
}
};
class Singleton
{
public static readonly Singleton Instance;
static Singleton()//静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数(由系统调用),不支持参数传递
{ Instance =new Singleton();
}
private Singleton()
{
}
};