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;}}