C# 设计模式-单例模式
一.介绍
单例模式(Singleton Pattern)。属于创建型模式。它保证一个类仅有一个实例,并提供一个访问它的全局访问点。
二.实现
结构为,一个私有的静态变量,用于存放该实例。私有的构造函数,防止外部直接创建该类实例。
创建单例模式有两种方式。饿汉式和懒汉式。
饿汉式是直接在程序中初始化一个对象实例。
//饿汉式 public class Singleton { /// <summary> /// 私有的静态变量,直接初始化 /// </summary> private static Singleton Instance = new Singleton(); /// <summary> /// 私有的构造函数 /// </summary> private Singleton() { } /// <summary> /// 获取静态实例的静态方法 /// </summary> /// <returns></returns> public static Singleton GetInstance() { return Instance; } }
上面饿汉式创建的单例模式有一个缺点,就是程序不使用也会创建一个实例,这样会占内存。而使用懒汉式创建的单例模式,是需要使用的时候,才去创建实例。
//懒汉式 public class Singleton2 { /// <summary> /// 私有的静态变量 /// </summary> private static Singleton2 Instance = null; /// <summary> /// 私有的构造函数 /// </summary> private Singleton2() { } /// <summary> /// 获取静态实例的静态方法 /// </summary> /// <returns></returns> public static Singleton2 GetInstance() { if (Instance == null) { Instance = new Singleton2(); } return Instance; } }
上面两种创建单例模式的方法在单线程使用的时候没有问题,饿汉式创建的实例在多线程中也没有问题,懒汉式创建的实例在多线程中就会出现问题。我们可以通过lock关键字在多线程中保证单例。
//单例模式 双重检查 public class Singleton3 { /// <summary> /// 私有的静态变量 /// </summary> private static Singleton3 Instance = null; private static object locker = new object(); /// <summary> /// 私有的构造函数 /// </summary> private Singleton3() { } /// <summary> /// 获取静态实例的静态方法 /// </summary> /// <returns></returns> public static Singleton3 GetInstance() { //先检查Instance是否为null,防止每次调用都锁定locker,影响性能 if (Instance == null) { //使用lock lock (locker) { if(Instance == null) { Instance = new Singleton3(); } } } return Instance; } }
参考 https://www.cnblogs.com/restartyang/articles/7770856.html