-
为什么要使用单例模式?
在软件系统中,有一种特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率 -
单例模式的特点?
保证一个类仅有一个实例,并提供一个该实例的全局访问点`
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance()
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
-
单线程单例模式几个要点
·单例模式中的实例构造函数可以设置为protected以允许子类派生
·单例模式一般不要支持ICloneable接口,因为这可能会导致多个实例
·单例模式一般不要支持序列化,因为这也可能导致多个实例
·单例模式只考虑到了对象创建的管理,没有考虑对象销毁的管理
·不能支持多线程环境 -
多线程单例
class SimpleSingleton
{
private static SimpleSingleton _instance;
private static readonly object _padlock = new object();
private SimpleSingleton(){}
public static SimpleSingleton Instance()
{
if (_instance == null)
{
lock (_padlock)
{
if (_instance == null)
{
_instance = new SimpleSingleton();
}
}
}
return _instance;
}
}
显然,这种实现方式并不是线程安全的,在多线程环境中可能会得到多个Singleton实例。要解决这一问题,可以使用双重否定的方式。首先创建一个Singleton类的私有静态变量 padlock
在实际应用中,一般可以利用C#静态初始化的特性来实现线程安全的Singleton
class ThreadSafeSingleton
{
private static ThreadSafeSingleton _instance = new ThreadSafeSingleton();
private ThreadSafeSingleton(){}
public static ThreadSafeSingleton Instance()
{
return _instance;
}
}
这种方法比较简单,但也有一个缺点,即无法实现延迟初始化。
- 单例模式扩展
·如何将一个实例扩展到n个实例?
·将new构造器调用转移到其他类中
理解单例模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”