1、动机:
必须保证系统中只有一个实例。是应该类设计者负责,还是使用者来负责呢?应该归属给类的设计者。
如何饶过常规的构造器,提供一种机制来保证一个类只有一个实例。
精神:如何控制用户使用new对一个实例构造器的任意调用。
2、意图
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
3、图
4、代码实现
单线程Singleton实现,可以使用参数的。即懒汉式实现方法。
public class Singleton
{
private static Singleton instance;
private Singleton {} //私有的构造器
//全局访问点
public static Singleton Instance
{
get
{
if ( instance == null )
{
instance = new Singleton();
}
return instance;
}
}
}
多线程Singleton实现,只能使用无参的。
public class Singleton
{
private static volatile Singleton instance=null;//volatile不会进行微调
private static object lockHelper = new Object();
private Singleton {} //私有的构造器
//全局访问点
public static Singleton Instance
{
get
{
if ( instance == null )
{
lock(lockHelper)
{
if ( instance == null )
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
饿汉式
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 {} //私有的构造器
}
另外还有登记式,从略。
5、要点
(1). 可以设置成protected
(2). 不要支持ICloneable接口
(3). 不要支持序列化
(4). 只考虑对象创建的管理,没有考虑对象销毁的管理
6、扩展
(1). 可以把1个实例扩展到n个实例,数据库连接对象。
(2). 将new构造器调用转移到其他类中间。
(3). 屏蔽构造器,或者在构造函数进行处理
7、应用
资源管理
回收站属性修改
多语言支持(多例)
序列生成器
发送邮件,有多台服务器(单例)
8、单例模式与多例模式的区别
单例模式使用聚集是保存的其他对象
多例模式保存的自身的实例