Singleton 用于需要确保在系统中仅存在类的一个实例时,例如全局状态保持类或工具类...
Singleton模式的实现基于两个要点:
1)不直接用类的构造函数,而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性,静态方法保证了不会创建出多余的实例。
2)将类的构造函数设为Private,即将构造函数"隐藏"起来,任何企图使用构造函数创建实例的方法都将报错。这样就阻止了开发人员绕过上面的Instance方法直接创建类的实例。
Singleton 分 Eager initialization 和 Lazy initialization 两种...
Eager initialization 例子...
public class Singleton
{
private static Singleton instance = new Singleton();
public static Singleton Instance()
{
return instance;
}
}
Lazy initialization 例子...
public class Singleton
{
private static Singleton instance = null;
public static Singleton Instance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Eager initialization 可能会造成资源的不合理分配,而 Lazy initialization 则在每次取得实例引用时,会占用多余的时间...
不正确地使用 Singleton 模式可能会带来很多麻烦,尤其是在分布式系统中...
但如果正确地运用 Singleton 模式会提升系统效率...
因为Singleton模式具有这样实用的价值,开发人员除了可以在程序代码中直接使用Singleton模式外,在许多大型系统的实现上也都处处可见它的影子。在微软隆重推出的.NET框架中,同样也可以发现Singleton思想闪烁的光芒。
举例来说,在.NET框架的重要组成部分Remoting中,远程对象(Remote Object)有两种激活方式:服务器端激活方式和客户端激活方式。采用服务器端激活方式的对象又分为两种类型:Singleton对象和SingleCall对象。Singleton 对象是这样的对象:无论该对象有多少个客户端调用,它总是只有一个实例,由这个实例来处理所有的客户端请求。相反地,若将远程对象声明为 SingleCall,则系统会为每次客户端方法的调用创建一个新对象,即使这些方法调用来自同一个客户端,也即,对象只在方法调用持续期间存在,一旦方法调用结束,该对象就会被销毁。显而易见,这里的Singleton对象就是设计模式Singleton思想在.NET中的应用。