软件编程
位置:首页>> 软件编程>> C#编程>> Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

作者:汐夜  发布时间:2023-08-24 14:53:28 

标签:unity,通用,泛型,单例,设计模式

单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。

普通泛型单例:


public abstract class Singleton<T> where T : class, new()
{
 private static T instance = null;

private static readonly object locker = new object();

public static T Instance
 {
   get
   {
     lock (locker)
     {
       if (instance == null)
         instance = new T();
       return instance;
     }
   }
 }
}

继承MonoBehaviour的泛型单例:


using UnityEngine;

public abstract class MonoSingleton <T>: MonoBehaviour where T:MonoBehaviour
{
 private static T instance = null;

private static readonly object locker = new object();

private static bool bAppQuitting;

public static T Instance
 {
   get
   {
     if (bAppQuitting)
     {
       instance = null;
       return instance;
     }

lock (locker)
     {
       if (instance == null)
       {
         instance = FindObjectOfType<T>();
         if (FindObjectsOfType<T>().Length > 1)
         {
           Debug.LogError("不应该存在多个单例!");
           return instance;
         }

if (instance == null)
         {
           var singleton = new GameObject();
           instance = singleton.AddComponent<T>();
           singleton.name = "(singleton)" + typeof(T);
           singleton.hideFlags = HideFlags.None;
           DontDestroyOnLoad(singleton);
         }
         else
           DontDestroyOnLoad(instance.gameObject);
       }
       instance.hideFlags = HideFlags.None;
       return instance;
     }
   }
 }

private void Awake()
 {
   bAppQuitting = false;
 }

private void OnDestroy()
 {
   bAppQuitting = true;
 }
}

使用方法直接用类去继承这两个抽象单例即可,使用T.Instance就可以直接取得该类(T)的唯一实例了。

来源:https://www.cnblogs.com/koshio0219/p/11203631.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com