unity 单例模式(实例详解)

文章目录


在Unity中,单例模式是一种常用的编程设计模式,用于确保在整个应用程序生命周期中,只有一个类的实例存在。这样可以保证数据的全局唯一性和共享性,例如游戏场景中的资源管理器、游戏控制器、事件管理器等。

以下是一个简单的C#实现Unity中单例模式的例子:

public class SingletonClass : MonoBehaviour
{
    private static SingletonClass _instance;

    public static SingletonClass Instance
    {
        get
        {
            if (_instance == null)
            {
                // 如果实例不存在,则查找场景中已有的SingletonClass组件并将其设置为_instance
                _instance = FindObjectOfType<SingletonClass>();

                // 如果没有找到实例,创建一个新的GameObject挂载SingletonClass脚本并设置为_instance
                if (_instance == null)
                {
                    var singletonObject = new GameObject();
                    _instance = singletonObject.AddComponent<SingletonClass>();
                    singletonObject.name = nameof(SingletonClass);
                    DontDestroyOnLoad(singletonObject); // 保持单例在整个应用生命周期内不被销毁
                }
            }

            return _instance;
        }
    }

    protected SingletonClass() {}

    private void Awake()
    {
        // 如果_instance尚未初始化,并且当前对象不是_instance(即第一次Awake调用)
        if (_instance == null && this != _instance)
        {
            // 设置当前对象为_instance
            _instance = this;
            
            // 防止切换场景时该单例对象被销毁
            DontDestroyOnLoad(gameObject);
        }
        else if (this != _instance) // 若_instance已存在但不是当前对象,则销毁多余的实例
        {
            Destroy(gameObject);
        }
    }
}

在C#中,protected SingletonClass() {} 这个构造函数的作用是限制类的实例化方式。在这个单例模式实现中,将构造函数设为 protected 有以下几点意义:

  1. 防止外部直接创建实例:由于构造函数是受保护的(protected),所以其他类无法通过 new SingletonClass() 的方式直接实例化该类。这样确保了只有单例类自己内部才能创建实例。

  2. 允许子类继承:尽管外部不能直接实例化,但这个构造函数对子类仍然是可见的。这意味着如果将来需要基于 SingletonClass 创建派生类,子类可以通过 base() 调用基类的构造函数进行初始化。

  3. 符合单例设计原则:在单例模式中,我们希望控制类的实例化过程,以确保在整个应用程序中只有一个实例存在。通过将构造函数设为 protected,并提供一个公共静态属性或方法来获取单例实例,可以确保这一目标得以实现。

因此,在上面的Unity单例模式实现中,protected SingletonClass() {} 构造函数是为了配合单例模式的实现策略,限制实例化权限,保证全局唯一性。

在上述代码中,SingletonClass 类遵循单例模式原则,确保无论何时何地访问 SingletonClass.Instance,返回的都是同一个实例。同时,为了防止场景切换时该单例对象被销毁,我们使用了 DontDestroyOnLoad 方法。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

你可能感兴趣的:(unity,C#设计模式详解,unity,单例模式,c#)