概述
单例模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。
常见实现方式
1.简单实现
namespace SingletonPattern
{
public sealed class Singleton
{
private static Singleton _Instance = null;
private Singleton() {/*构造函数私有*/ }
public Singleton Instance
{
get
{
if (_Instance == null)
{
_Instance = new Singleton();
}
return _Instance;
}
}
}
}
2.线程安全
namespace SingletonPattern
{
public sealed class Singleton
{
private static Singleton _Instance = null;
private static object _lockOjb = new object();
private Singleton() {/*构造函数私有*/ }
public Singleton Instance
{
get
{
lock (_lockOjb)
{
if (_Instance == null)
{
_Instance = new Singleton();
}
}
return _Instance;
}
}
}
}
另外,还有一种双重锁定的实现方式
namespace SingletonPattern
{
public sealed class Singleton
{
private static Singleton _Instance = null;
private static object _lockOjb = new object();
private Singleton() {/*构造函数私有*/ }
public Singleton Instance
{
get
{
//先判断是否为空,再锁定
if (_Instance == null)
{
lock (_lockOjb)
{
if (_Instance == null)
{
_Instance = new Singleton();
}
}
}
return _Instance;
}
}
}
}
3.静态初始化
namespace SingletonPattern
{
public sealed class Singleton
{
private static readonly Singleton _Instance=new Singleton();
/// <summary>
/// 静态构造函数
/// </summary>
static Singleton() { }
private Singleton() {/*构造函数私有*/ }
public Singleton Instance
{
get
{
return _Instance;
}
}
}
}