单例模式顾名思义,就是只有一个实例。
作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类
单例模式的要点
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
/// <summary>
/// 功能:懒汉式单例模式:
///优点是延时加载、缺点是应该用线程同步
/// </summary>
public class Sigleton
{
/// <summary>
/// 私有的对象
/// </summary>
private static Sigletoninstance;
/// <summary>
/// 构造方法为Private
/// </summary>
private Sigleton()
{
}
/// <summary>
/// 公有的属性
/// </summary>
public static Sigleton Instance
{
get
{
if(instance == null)
{
instance = new Sigleton();
}
return instance;
}
}
}
/// <summary>
/// 功能:饿汉式单例模式:
/// 需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。
/// </summary>
public class Sigleton
{
private static readonly Sigleton instance = new Sigleton();
private Sigleton(){}
public static Sigleton Instance
{
get
{
return instance;
}
}
}
/// <summary>
/// 功能:懒汉式单例模式: 双重加锁
/// 解决了线程同步的问题
/// </summary>
public class Sigleton
{
private static volatile Sigleton instance;
/// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>
private static object syncRoot = new Object();
/// <summary>
/// 构造方法改为Private
/// </summary>
private Sigleton()
{
}
public static Sigleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Sigleton();
}
}
return instance;
}
}
}