【设计模式】单例模式
单例模式
保证一个类仅有一个实例, 并提供一个全局访问这个实例的方法.
多线程的时候同时访问时可能会造成实例化出多个实例.
sloution 1. 加锁
通常来说开发者会考虑为单例模式类添加一个锁, 但是这种方式会造成每次调用
GetInstance()
的时候都需要lock. 这会对效率产生影响.
private static readonly object locker = new object();
public class SingletonClass
{
private SingletonClass singletonInstance = null;
private static readonly object locker = new object();
private SingletonClass() { }
public SingletonClass GetInstance()
{
lock (locker)
{
if (singletonInstance == null)
{
singletonInstance = new SingletonClass();
}
return singletonInstance;
}
}
}
sloution 2. 双重锁定
使用两次 singletonInstance == null 去判断.
public class SingletonClass
{
private SingletonClass singletonInstance = null;
private static readonly object locker = new object();
private SingletonClass() { }
public SingletonClass GetInstance()
{
if (singletonInstance == null)
{
lock (locker)
{
if (singletonInstance == null)
{
singletonInstance = new SingletonClass();
}
}
}
return singletonInstance;
}
}
sloution 3. 静态初始化
使用
静态初始化
的方式保证单例
private static readonly StaticSingletonClass staticSingletonInstance = new StaticSingletonClass();
/// <summary>
/// 使用sealed去保证这个类不被派生
/// 第一次引用类的任何实例的时候创建静态只读的instance
/// </summary>
public sealed class StaticSingletonClass
{
private static readonly StaticSingletonClass staticSingletonInstance = new StaticSingletonClass();
private StaticSingletonClass() { }
public static StaticSingletonClass GetInstance()
{
return staticSingletonInstance;
}
}
总结
solution1和2都是在类被访问的时候, 才初始化出实例, 这种单例方式被称作懒汉单例模式.
而solution3是程序启动的时候, 就初始化完毕, 这种方式被称为饿汉单例模式.这种方式虽然避开了多线程访问的问题, 但是会提前占用系统的资源. 所以具体使用哪种方式实例化单例, 需要根据具体的实际情况.