Singleton的使用

  • Singleton
    • 继承
    • 私有构造
  • MonoSingleton
    • 继承即可
  • SingletonProperty
    • 实现ISingleton接口
    • 在属性器中实现
  • MonoSingletonProperty
    • 实现ISingleton接口
    • 继承MonoBehaviour或其子类
    • 在属性器中实现
  • MonoSingletonPath
    • 支持MonoSingleton与MonoSingletonProperty

单例的最佳实践

  1. 严格控制对外暴露的API
  2. 严格控制单例的使用范围
    • 模块命名
    • 职责尽量少
  3. 严格控制单例对象的生命周期(创建、初始化、销毁)

设计原理

  1. ISingleton有两个作用,一个是泛型的约束,一个是提供统一的初始化接口(OnSingletonInit)。
  2. MonoSingletonPath是为了让单例模块方便管理。

实现套路

  • 通过反射创建实例
  • Attribute与反射的使用

补充

由于Singleton与SIngletonProperty都需要用到通过反射创建实例的功能,所以把这个功能单独提取出来,放到了SingletonCreator里。本质上是为了减少重复代码。

MonoSingleton与MonoSingletonProperty也需要相同的创建实例方式(创建GameObject),所以也单独写了一个MonoSingletonCreator。

SingletonKit看起来比一般的单例复杂一点,主要是因为它本身有一定的结构。

每个方法对应的服务

SingletonKit的UML

决定版补充

有了决定版架构,就不用C#单例了,但是Mono还需要使用,Mono的单例的数据部分交给决定版架构管理,既保留Mono单例的便利,又降低了Mono单例的风险。