UF_OLDL1——单例模式基类
UF_OLDL1——单例模式基类
单例模式
一般的单例模式差不多都会写类似于下面的这种形式,区别几乎只在于类名
1 | public class GameManager |
或者用静态方法来也可以获取私有静态变量
1 | public class BaseManager |
如果是继承MonoBehaviour的类,不能new(),如何让私有静态变量装载该类呢
在Awake()里instance = this即可
1 | public class GameManager : MonoBehaviour |
单例模式可以确保该类只能有一个实例化对象,且只能通过静态属性调用它的成员
类似于 GameManager.Instance.____ 这样的形式
这种模式尤其适合只需要在程序里存在一个对象的类,例如各种管理器
与静态类的区别
静态类也是只能用类名调用且不能实例化的类,它和单例模式类有什么区别呢?
- 静态类的方法适合纯数据处理,不依赖其它对象实例,写入参数就可以,但这也是它的限制,方法里是不可调用它的实例对象的。
- 单例模式,看起来也不用实例化,但实际第一次调用时它在内部创建了实例化对象,之后都是在调用这个实例,他的方法中就可以调用其它实例方法了。
- 静态类不能过多,他会一开始就需要将方法逻辑编译成本机代码(win,mac,linux),
这就会在程序启动时形成过多cpu计算。而实例是在实例方法第一次被调用时才编译成本机代码(只编译一次)。 - 所以应该尽量使用实例,有更好的内存管理gc释放,也会分散编译方法体的本机代码
单例模式管理器基类
涉及知识点:泛型,单例模式
作用:减少单例模式重复代码的书写
使用方法:
需要作为单例模式的类直接继承该方法,泛型参数填入自己的类,该类即可当作单例模式使用
需要注意的是,这里并没有用私有构造函数来限制外部实例化单例,这里需要注意(由于约束,这里并不方便使用私有构造函数)
1 | public abstract class BaseManager<T> where T : new() //使用泛型方法,使派生类中的私有变量和返回方法能够转载和返回自己类型的类对象 |
使用示例
1 | public class GameManager : BaseManager<GameManager> |
继承MonoBehaviour的单例模式基类
继承了MonoBehaviour的类,不能直接new(),只能通过拖曳到对象上或GameObject.AddComponent<>()来构造
因此需要在Awake()里让私有静态变量等于自己
使用方法:
需要作为单例模式的类直接继承该方法,泛型参数填入自己的类,该类即可当作单例模式使用
第一种实现方式
需要注意的是,这个基类并不能保证类对象只能被创建一次,如果多次创建,则静态方法只能获取到最后一次构建的类对象
而单例模式的唯一性也会遭到破坏
1 | using UnityEngine; |
第二种实现方式
这个改造避免了我们手动向某个对象添加脚本,当静态私有变量没有该类对象时,自动添加一个挂载该脚本的空对象
1 | using UnityEngine; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!