unity管理器设计:Manager of Managers
一、管理器Manager
Manager管理器是对一类对象进行统一管理,像是UIManager,AudioManager,InputManager等。
UIManager对UI的生命周期进行统一管理,AudioManager对音频的播放进行统一管理,InputManager对玩家的输入进行统一管理。
一个Manage对应管理一类对象,Manager是全局唯一的,所以通常以单例实现Manager。
二、Manager of Managers
随着功能的开发,Manager的数量不断增加,单例会逐渐变得难以管理。
为了解决单例数量太多难以管理的问题,引入一个大的单例Manger做为入口,通过这个Manager去访问其他子Manager。
全局只存在一个大的单例Manger。
三、代码实现
单例:
public abstract class Singleton<T> where T : class, new() { private static T _instance; public abstract void Init(); public static T Instance { get { if(_instance == null) _instance = new T(); return _instance; } } }
管理器入口GameManager:
using System; using System.Collections.Generic; namespace Manager { /// <summary> /// Manager入口 /// </summary> public partial class GameManager : Singleton<GameManager> { private Dictionary<Type,BaseManager> managerDic = new Dictionary<Type, BaseManager>(); public override void Init() { OnInit(); } public T Get<T>() where T : BaseManager, new() { Type type = typeof(T); if (!managerDic.ContainsKey(type)) { T manager = new T(); manager.OnInit(); managerDic[type] = manager; } return (T)managerDic[type]; } public void ClearManager<T>(T type) where T : BaseManager, new() { if(managerDic.ContainsKey(type as Type)) { type.OnClear(); managerDic[type as Type] = null; type = null; } } public void CleaerAllManagers() { foreach (var keyValuePair in managerDic) { keyValuePair.Value.OnClear(); BaseManager manager = keyValuePair.Value; manager = null; } managerDic.Clear(); } } }
namespace Manager { public partial class GameManager : Singleton<GameManager> { // manager初始化 private void OnInit() { Instance.Get<InoutManager>().OnInit(); } } }
BaseManager
public abstract class BaseManager { public abstract void OnInit(); public abstract void OnClear(); }

浙公网安备 33010602011771号