C# 设计模式之单例模式(懒汉模式、饿汉模式、静态内部类模式)
应用场景:在整个软件运行生命周期内,一个类只允许一次实例化,例如数据库连接池的连接对象创建;通过使用单例模式来避免反复创建连接对象,从而降低非必要性能浪费
1.Main 方法代码
class Program
{
static void Main(string[] args)
{
单例模式之懒汉模式-延迟加载方案
LazySingleton instance = LazySingleton.getInstance();
LazySingleton instance1 = LazySingleton.getInstance();
Console.WriteLine(instance == instance1);
单例模式之饿汉模式
HungrySingleton instance2 = HungrySingleton.getInstance();
HungrySingleton instance3 = HungrySingleton.getInstance();
Console.WriteLine(instance2 == instance3);
//单例模式之静态内部类模式
InnerClassSignleton instance4 = InnerClassSignleton.getInstance();
InnerClassSignleton instance5 = InnerClassSignleton.getInstance();
Console.WriteLine(instance4 == instance5);
Console.ReadKey();
}
}
2.各模式类
// 懒汉模式类
class LazySingleton
{
private static readonly object locker = new object();
private volatile static LazySingleton instance;//volatile 关键字,防止字节码执行阶段CLR或者CPU重排序执行
private LazySingleton()
{
}
public static LazySingleton getInstance()
{
if (instance == null)
{
lock (locker)
{
if (instance == null)
{
instance = new LazySingleton();
}
}
}
return instance;
}
}
//饿汉模式类
class HungrySingleton
{
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() { }
public static HungrySingleton getInstance()
{
return instance;
}
}
//静态内部类
class InnerClassSignleton
{
private static class InnerClassHolder
{
public static InnerClassSignleton instance = new InnerClassSignleton();
}
private InnerClassSignleton()
{
if (InnerClassHolder.instance != null)
{
throw new Exception("单例模式不允许多个实例");
}
}
public static InnerClassSignleton getInstance()
{
return InnerClassHolder.instance;
}
}