定义:
一个类只有一个实例,且该类能自行创建这个实例的一种模式。(也就是一个类只能实例化一次)
特点:
1.单例类只有一个实例对象;
2.单例对象必须由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点。
优点:
1.以保证内存里 只有一个实例,减少了内存的开销;
2.避免对资源的多重占用;
3.设置全局访问点,可以优化和共享资源的访问。
缺点:
1.一般没有接口,扩展困难;
2.在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象;
3.功能代码设计不合理的话,容易违背单一职责原则。
2.1 饿汉式
声明时直接创建
class HungerySingleton
{
private static HungerySingleton instance = new HungerySingleton();//构造函数
private HungerySingleton()
{
Console.WriteLine("饿汉式");
}//功能实现
public void use()
{
/* */
}public static HungerySingleton getInstance()
{
return instance;
}
}
2.2 懒汉式
声明时不赋值
class LazySingleton
{
//volatile防止指令重排序导致对象分配了地址却未初始化
//分配地址后则instance!=null
private static volatile LazySingleton instance = null;//c#没有synchronized,因此使用lock进行双重锁检查
private static readonly object padlock = new object();private LazySingleton()
{
Console.WriteLine("懒汉式");
}public static LazySingleton getInstance()
{
if (instance == null)
{
lock (padlock)
{
if (instance == null)
{
instance = new LazySingleton();
}
}
}return instance;
}
}
总结:饿汉式单例模式,在声明时直接创建实例化对象,客户通过get方法直接调用; 懒汉式单例模式,是在调用get方法时检查对象是否存在,不存在则实例化对象。