Unity-单例模式

Unity-单例模式

前言

​ 对于某些特殊的类,我们希望 在整个程序的生命周期只创建一个该类的对象 ,或是希望 在其他类没有持有该类的引用,就可以调用该类中的函数,我们就需要将这个类写成 单例模式

单例的简单实现

public class Test()
{
	pubic abstract Test Instance;//创建程序中该类的唯一一个对象
    
    private void Awake()//在程序启动时,直接创建一个该类的对象
    {
        if(Instance!=null)//如果已经创建了一个变量,便将该变量删除
        {
            Destroy(gameObject);
        }

        Instance = this;
    }
}

泛型单例

为什么需要泛型单例

​ 在通常的游戏制作中,我们会创建许多的 Manager 来管理我们的游戏,如果每创建一个 Manager 都要重新写一遍单例会非常麻烦,因此就需要 泛型单例

代码实现

泛型单例,顾名思义就是事先不知道单例的类型,其类型取决于继承该泛型父类的子类

​ 代码如下:

public class Singleton<T> : MonoBehaviour where T :Singleton<T> //where确定继承该父类的是什么类型的子类
{
    private static T instance;

    //用于获取单例的属性
    public static T Instance
    {
        get { return instance;}
    }

    //程序启动时调用,给单例唯一变量赋值
    protected virtual void Awake()
    {
        if(instance != null)
        {
            Destroy(gameObject);
        }
        else
        {
            instance = (T)this;
        }
    }

    //判断单例是否已经被创建的属性
    public static bool IsInitialized
    {
        get { return instance != null;}
    }
    
    //销毁函数
    protected void OnDestroy() 
    {
        if(instance == this)
        {
            instance = null;
        }    
    }
}

更多可能

​ 如果我们在一个项目中 过度使用单例模式,就会造成该项目的 耦合性非常高,一个单例中的某个变量,可能同时被十几个对象引用,导致牵一发而动全身,使得项目 难以维护。我们急需一种方法,能够提供单例模式的功能,但又没有单例模式如此之高的耦合度。

​ 分析单例模式的功能:它能够让我们在任何地方读取某个对象的信息,但前提是我们必须持有这个对象的引用。那么有没有什么方法可以不持有该对象的引用,但仍然可以读取该对象的信息呢?

​ 这时候我们就可以使用设计模式中的 观察者模式

参考资料

观察者模式 - AshScops - 博客园 (cnblogs.com)

观察者设计模式 (refactoringguru.cn)

posted @ 2023-11-14 19:06  Daliuteliu  阅读(34)  评论(0编辑  收藏  举报