单例模板
单例模板
背景
单例模式在游戏中运用广泛,但是每次在一个类中声明单例都需要手写一遍,带来的后果就是代码重复、每次写的单例还可能不一样、多人协作开发时单例的实现方式可能各不相同。所以便创建了单例模板,用于规范单例的书写,外部不需要关心单例内部如何实现,达到即装即用的目的。
使用
创建单例
无需创建GameObject,不需要依赖mono的
将音效模块SFXManager声明为单例:
直接继承BaseSingleTon即可,<>中填入对应的类名1
public class SFXManager : BaseSingleTon<SFXManager>
需要依赖mono或需要创建GameObject的
以中央管理系统GameManager举例:1
public class GameManager : MonoSingleton<GameManager>
调用单例
调用单例对象的函数通过-> 类名.Instance.函数名
1 | // 调用SFXManager播放音效 |
注意事项
- 基本上除了GameManager继承自Mono单例,其他需求都尽量继承非mono单例,生命周期交由GameManager管理,详见中央管理器GameManager。目的是方便模块管理和调试,以及脱离对mono的依赖,使模块更独立,与外部耦合度更低。
- 使用单例前,一定要明确需求,是否一定要通过单例来调用函数,是否全局仅一份实例,不能为了图方便而去使用单例,不该用单例的地方用单例,这样会导致单例泛滥,使得项目难以维护。一般来说,以模块或以系统为单位的可以使用单例,像背包系统,可以全局仅维护一份,其再维护所有背包。
内部实现
类内部进行对象的实例化操作:
BaseSingleTon:Scripts/Core/Base/Singleton/BaseSingleTon
类内部进行对象实例化时,会多一步操作,检测已有实例对象GameObjcet,有的话进行Destory,确保只有一个实例:
MonoSingleton:Scripts/Core/Base/Singleton/MonoSingleton
评论