一:目标

当设计一个Manager时候,咱们心愿整个程序只有一个该Manager的对象实例,最先想到的实现办法是这样的

public class XXXManager{    private static XXXManager _instance = null;    public static XXXManager Ins    {        get        {            if (_instance == null)            {                _instance = new XXXManager();            }            return _instance;        }    }}

如果每一个管理器类都实现一遍以上的单例代码会造成代码的反复,所以咱们要想方法把反复的代码抽离进去 

二:解决的问题及长处

——解决了实现单例代码的反复问题
——动态创建空物体并挂载脚本,不须要手动创立物体和挂载脚本

三:应用办法

须要实现单例的类间接继承单例模版即可,有继承MonoBehaviour和不继承MonoBehaviour两种

public class GameMgr : MonoSingleton<GameMgr>{ } public class UIMgr : Singleton<UIMgr>{ }

四:代码实现

/// <summary>/// 不继承Mono的单例模版/// </summary>public abstract class Singleton<T>    where T : new(){    private static T _instance;    public static T Ins    {        get        {            if (_instance == null)            {                _instance = new T();                (_instance as Singleton<T>).Init();            }            return _instance;        }    }     /// <summary>    /// 子类初始化的一些操作    /// </summary>    protected virtual void Init()    {     }}
using UnityEngine; /// <summary>/// 继承Mono的单例模版/// </summary>public abstract class MonoSingleton<T> : MonoBehaviour    where T : MonoSingleton<T>{    private static T _instance;    public static T Ins    {        get        {            if (_instance == null)            {                GameObject go = null;                T t = FindObjectOfType<T>();                if (t == null)                {                    go = new GameObject(typeof(T).Name);                    _instance = go.AddComponent<T>();                }                else                {                    go = t.gameObject;                    go.name = typeof(T).Name;                    _instance = go.GetComponent<T>();                }                 DontDestroyOnLoad(go);            }            return _instance;        }    }}

图片起源:手游