Unity设计模式之单例模式

Unity设计模式之单例模式

定义

单例模式(Singleton)是设计模式中很常见的一种设计模式,目的是为了让一个类在程序运行期间有且仅有一个实例,且方便全局访问。

实现

1、私有的构造函数。

2、含有一个该类的静态私有对象。

3、静态的公有函数或属性,方便用户创建或者获取它本身的静态私有对象。

适用场景

当项目中的某一个对象,在程序运行的过程中,只有一个对象,可以使用单例模式。

例如:资源管理类,日志管理类等,受项目影响比较小,可以多个项目共同使用。

优缺点

优点

1、单例模式只生成一个实例,限制对象数量,减少内存开支和系统性能消耗。

2、使用方便,提供全局访问的函数或属性。

缺点

1、容易为了使用方便造成过度使用的问题,但并不是要求设计者不使用这个模式,而是在仔细设计和特定的前提下,适当使用。

举例

C# 单例


/// <summary>
/// 一个简单的单例
/// </summary>
public class Test
{
    #region Instance

    private static Test _Instance;
    public static Test Instance
    {
        get
        {
            if (_Instance == null)
            {
                _Instance = new Test();
            }
            return _Instance;
        }
    }

    private Test() { }
    #endregion
}

Unity mono单例

相比于C#单例,mono单例需要注意的是

1、创建对象的时候,需要创建一个相应的对象,然后将脚本添加。

2、对象Awake的时候,需要判断是否已经创建了对象,如果创建了,需要销毁当前对象。

3、我这里在OnDestroy的时候,把静态变量销毁了,是因为有些逻辑里面可能需要销毁这个对象,重新创建。

using UnityEngine;

/// <summary>
/// 一个简单的mono单例
/// </summary>
public class Test : MonoBehaviour
{
    #region Instance
    private static Test _Instance;
    public static Test Instance
    {
        get
        {
            if (!_Instance)
            {
                _Instance = GameObject.FindObjectOfType<Test>();
                if (!_Instance)
                {
                    GameObject obj = new GameObject();
                    _Instance = obj.AddComponent<Test>();
                }
            }
            return _Instance;
        }
    }

    private void Awake()
    {
        if (_Instance)
        {
            Destroy(gameObject);
        }
    }

    private void OnDestroy()
    {
        _Instance = null;
    }
    #endregion
}

通用mono单例

要做一个通用的mono单例,这里我们需要使用泛型来实现一个基类。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// mono单例
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    protected static T _instance;

    /// <summary>
    /// 是否实例化
    /// </summary>
    public static bool initialized;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<T>();
                if (FindObjectsOfType<T>().Length > 1)
                {
                    return _instance;
                }
                if (_instance == null)
                {
                    string name = typeof(T).Name;
                    GameObject obj = GameObject.Find(name);
                    if (obj == null)
                    {
                        obj = new GameObject(name);
                    }
                    _instance = obj.AddComponent<T>();
                    DontDestroyOnLoad(obj);
                }
            }
            initialized = true;
            return _instance;
        }
    }

    protected virtual void Awake()
    {
        if (initialized)
        {
            Destroy(gameObject);
        }
    }

    protected virtual void OnDestroy()
    {
        _instance = null;
        initialized = false;
    }
}

实现类

using UnityEngine;

/// <summary>
/// 一个简单的mono单例
/// </summary>
public class Test : MonoSingleton<Test>
{
    public void MonoTest() {
        Debug.Log("test");
    }
}

尾语

如果有说的不好的地方,欢迎各位大佬批评指正。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定九号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值