单例模式简介
单例模式是一种常见的设计模式,它的核心结构为一个特殊的单例类。通过单例模式可以保证系统中一个类只有一个实例。常见的实现方式有:
- 懒汉模式:不到万不得已是不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化。
- 饿汉模式:在单例类定义的时候就进行实例化;无论是否用到,先实例化再说。
一般情况下,单例模式都需要考虑线程安全,保证多线程环境下的使用安全。
同步锁方式
通过两次判断,保证在实例instance
已创建时,避免加锁的消耗;当实例未创建时,通过锁保证实例只会创建一份。
sealed class SingleTonWithLocker {
private static SingleTonWithLocker _instance = null;
private readonly static object _lker = new object();
public static SingleTonWithLocker GetInstance() {
if(_instance == null) {
lock (_lker) {
if (_instance == null)
_instance = new SingleTonWithLocker();
}
}
return _instance;
}
}
静态变量方式
通过类的静态构造函数(执行静态构造函数内部语句前,会先初始化静态变量)只调用一次的模式,保证单例。
sealed class SingleTonWithStatic {
static SingleTonWithStatic _instance = new SingleTonWithStatic();
public static SingleTonWithStatic Instance {
get { return _instance; }
}
}
此方式虽可以保证单例,但是若类有其他方法被调用,但并没有使用Instance
,实例也会被创建。通过私有嵌套类,可以保证只在需要时创建实例。
即使其他函数调用被调用,只要没有主动去获取就不会去创建单例实例。
sealed class SingleTonWithNest {
class Nested
{
internal static SingleTonWithNest _instance = new SingleTonWithNest();
}
public static SingleTonWithNest Instance
{
get { return Nested._instance; }
}
// ... Other functions
}