意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点。
基本Code:
public class Singleton
{
private static Singleton instance;
Private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Instance();
}
return instance;
}
}
}
带参数的Singleton模式:
public class Singleton
{
private static Singleton instance;
int x, y;
Private Singleton(int i,int j)
{
this.x=i;
this.y=j;
}
public static Singleton GetInstance(int i,int j)
{
if (instance==null)
{
instance=new Instance(i,j);
}
return instance;
}
}
}
需要注意的问题:
1、 Singleton模式中的实例构造器可以设置为protected以允许子类派生;
2、 Singleton模式中一般不要实现ICloneable接口,因为这有可能导致多个对象实例;
3、 Singleton模式中一般不要支持序列化,因为这也有可能导致多个对象实例;
4、 Singleton模式只考虑了对象创建的管理,没有考虑对象销毁的考虑。就支持垃圾回收的平台和对象开销来讲,我们一般没有必要对其销毁进行执行特殊处理;
5、 不能应对于多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例。
支持多线程的Singleton模式Code:
public class Singleton
{
private static volatile Singleton instance = null;
private static object lockHelper = new object();
Private Singleton()
{
}
public static Singleton Instance
{
get
{
Lock(lockHelper);
{
if (instance==null)
{
instance=new Instance();
}
}
return instance;
}
}
}
注:volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。
另外一种Singleton模式:
public class Singleton
{
public static readonly Singleton Instance = new Singleton();
Private Singleton()
{
}
}
上面的代码等同于下面的代码:
public class Singleton
{
public static readonly Singleton Instance
static Singleton()
{
Instance=new Singleton();
}
private Singleton()
{
}
}
对于参数而言,我们可以先创建对象,然后再给对象中的属性赋值。如果需要处理资源,可以单独写方法来完成资源的初始化。
理解和扩展Singleton模式的核心是“如何控制用户使用new 对一个类的实例构造器的任意调用。