单例基类
什么是单例模式
单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式确保一个类只有一个实例,并提供一个全局访问点。C#中实现单例有很多种实现方法,在所有的实现版本中,都有以下几个共同点:
- 唯一的、私有的且无参的构造函数,这样不允许外部类进行实例化;
- 类是密封的,尽管这不是强制的,但是严格来讲从上一点来看密封类能有助于JIT的优化;
- 一个静态变量应该指向类的唯一实例;
- 一个公共的静态变量用于获得这个类的唯一实例(如果需要,应该创建它);
这里简单介绍两个实现模式
懒汉式(LazyLoading):需要才创建实例,延迟加载;
饿汉式:第一时间创建实例,类加载就马上创建;
单例基类-C#
使用泛型T指定实例类型,使用无参构造函数约束new和基类约束;由于全局唯一,使用静态属性Instance并在获取属性时判断属性是否为空,空则new一个,反之直接返回instance。(以上通过属性实现在get时才真正实例化对象的Lazy Loading模式避免了资源浪费,由于Unity一般不采用多线程的开发模式,Lazy Loading模式基本能满足需求)
public abstract class Singleton<T> where T : Singleton<T>, new() { private static T instance; public static T Instance { get { if(instance == null) { instance = new T(); } return instance; } } }
注:new确保在类内可以对T进行实例化,基类约束的意义是限定传进来的泛型参数为Singleton的子类,写的时候把自己传进去
单例基类-MonoBehavior
适用于挂载在游戏物体的脚本对象。挂载在游戏物体上的脚本对象生命周期和游戏物体一致,故使用饿汉式实现单例模式。
public abstract class SingletonMono<T> : MonoBehavior where T : Singleton<T> { private static T instance; public static T Instance { get => instance; } protected virtual Awak() { if (instance == nul) { instance = (T)this; } } }
注:如果Mono单例对Awake进行重写必须要base.awake完成实例化
JKFrame v1.0 文章被收录于专栏
个人学习用