您现在的位置是:首页 >技术教程 >[Unity] No.1 Single单例模式网站首页技术教程

[Unity] No.1 Single单例模式

感天动地大白狗 2023-06-17 00:00:02
简介[Unity] No.1 Single单例模式

单例模式

1. 基础

定义:单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。在Unity的编程中比如①用于输入管理的InputManager;②时间中心EventSystem等,这类具有很强且频繁功能的组件往往会写成单例的模式。

类型:单例模式可分为懒汉模式和饿汉模式两种,本文不做详细讲述。
懒汉式:在真正需要使用对象时才去创建该单例类对象;
饿汉式:在类加载时已经创建好该单例对象,等待被程序使用;

代码:一个C#单例模式的代码如下,其定义了一个class T的一个单例

using System;

namespace UnityLearn
{
    public class Single<T>
        where T: class
    {
        private static T _instance;

        // 没有实例时创建一个实例,有的话返回创造过的那个实例
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    Type type = typeof(T);
                    _instance = Activator.CreateInstance(type, true) as T;
                }

                return _instance;
            }
        }
        protected Single(){}
    }
}

在实际使用时,如想创建一个Class的单例可直接使用以下方式:

public class A : Single<A>
{
    // 类内容
}

2. SingleMono

但是我们在Unity中往往都会用到MonoBehavior,此时需要将单例代码稍加修改:

    public class SingleMono<T> : MonoBehaviour
        where T: SingleMono<T>
    {
        protected static T instance;
        // 创建一个GameObject,也是单例的
        private static GameObject go;

        public static T Instance
        {
            get
            {
                // 在创建时也会检查go
                if (instance == null)
                {
                    if (!go)
                    {
                        // go不存在时先Find,找不到的话再创建
                        go = GameObject.Find("SingletonMono");
                        if (!go)
                        {
                            go = new GameObject("SingletonMono");
                        }
                        // 不被销毁
                        DontDestroyOnLoad(go);
                        // 从物体上获得单例
                        instance = go.GetComponent<T>();
                        // 物体上没有单例时添加一个单例
                        if (!instance)
                        {
                            instance = go.AddComponent<T>();
                        }
                    }
                }

                return instance;
            }
        }
    }

实际使用时用法类似:

public class A : SingleMono<A>
{
    // 类内容
}

代码中的where T: SingleMono<T>我也难以理解是什么意思,有知道的朋友请答疑解惑,不胜感激。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。