亦称:单件模式、Singleton

单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。

💡 适合应用场景

  1. 需要频繁实例化然后销毁的对象(例如数据库连接)。
  2. 有状态的工具类对象。
  3. 🖇 结构

    image.png

    # 代码示例

    特征:
  • 单个构造函数,它是私有且无参数的。这可以防止其它类实例化它(不然将违反模式)。
  • 一个静态变量,它保存对单个创建的实例的引用(如果有)。
  • 获取对单个已创建实例的引用的公共静态方法,如果有必要,请创建一个实例。

一、

  1. public class Singleton
  2. {
  3. private static readonly Singleton _instance = new Singleton();
  4. // 显式静态构造函数告诉 C# 编译器不要将类型标记为 beforefieldinit
  5. static Singleton() { }
  6. private Singleton() { }
  7. public static Singleton Instance => _instance;
  8. }

二、

  1. public class Singleton
  2. {
  3. private static readonly Lazy<Singleton> lazy = new(() => new Singleton());
  4. public static Singleton Instance => lazy.Value;
  5. private Singleton() { }
  6. }

还有其它的方式但少用。

🤔 与静态类相比

  1. 如果是简单的工具类,直接使用静态类即可。
  2. 如果该方法可被重写,或去实现接口,使用单例。
    1. 例如IGuidGenerator是一个Guid生成器,里面有Create()方法,而这个方法又很常用。您可以使用DefaultGuidGenerator去继承并实现,然后通过上述第一种或第二种创建一个单例,这样就可以很轻松的使用了。如果以后需要重写,就只需要更改获取实例的地方即可。

在现代框架下(Spring,.NET Core Abp等),如果不是的单纯的工具类,建议一律使用接口+单例模式