一、管理器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(); }