unity3d中单例模式两种简单写法与对比

一、

dart 复制代码
public class UlManager
{
   	private static UlManager instance;
   	private void Awake()
	{
   	 	if(instance != null)
        	Destroy(this);
    	else instance = this;
	}
}

二、

dart 复制代码
public class UlManager
{
    private static UlManager instance;
    public static UlManager Instance
    {
        get
        {
            if (instance == null)
               	 instance = new UlManager();
            else return instance;
        }
    }
}

初始化时机:

第一种方式:在 Awake() 方法中进行初始化。这意味着当对象被实例化时,Awake() 方法会被调用,首先,代码检查是否已经存在了该类的一个实例。这通过检查 instance 变量是否为 null 来实现。如果 instance 不为 null,这意味着已经存在一个实例,那么当前的对象就不需要再存在了,所以使用 Destroy(this) 来销毁当前对象(即当前脚本所附加的对象)。如果 instance 为 null,则将当前对象赋值给 instance 变量,表示该对象是这个类的实例

第二种方式:在访问 Instance 属性时进行初始化。当第一次访问 Instance 属性时,会检查 instance 是否为 null,如果是,则创建一个新的实例并赋值给 instance。

处理重复实例:

第一种方式:在 Awake() 方法中检查是否已经存在一个实例,如果已经存在则销毁当前对象,以确保只有一个实例存在。

第二种方式:在 Instance 属性中检查是否已经存在一个实例,如果已经存在则直接返回该实例,这样可以确保只有一个实例存在,并且只有在需要使用实例时才进行初始化。

返回值类型:

第一种方式:没有提供静态属性或方法来获取实例,因此在外部无法直接访问实例,也无法使用 UlManager.instance 来获取实例。如果需要访问实例,则需要将 instance 字段设置为 public,这样才能在外部访问。

第二种方式:通过静态属性 Instance 返回实例,外部可以直接通过 UlManager.Instance 访问单例实例,这样更加方便。

既然第一种方法无法在外部访问实例,那为什么还算是单例模式呢?

单例模式的核心思想是确保一个类只有一个实例,并提供全局访问点来访问该实例。第一种方法在 Awake() 方法中确保了只有一个实例存在,因此符合单例模式的定义。尽管在外部不能直接访问实例,但这并不影响它是单例模式的一种实现。

虽然第一种方法不能在外部直接访问实例,但仍然可以通过提供一些其他方法来访问实例,例如提供一个静态方法或属性来返回实例。再例如,你可以将 instance 字段设置为 public,然后在外部通过 UlManager.instance 来访问实例。虽然这种方式不够直观和安全,但它仍然可以用作单例模式的一种实现。

综上所述,第一种方法虽然在访问实例上不够方便,但它仍然满足了单例模式的定义,因为它确保了只有一个实例存在,并提供了一种全局访问该实例的方式。

相关推荐
Mark White18 小时前
行为树(Behavior Tree):从 ROS 机器人到 Unity 游戏 AI 的统一决策范式
游戏·unity·机器人
吴可可12319 小时前
C#显示错误行号的三种方式
c#
小贺儿开发20 小时前
Unity UGUI 可视化热区编辑与交互系统
unity·编辑器·游戏引擎·交互·工具·适配·ugui
魔法阵维护师20 小时前
从零开发游戏需要学习的c#模块,第二十七章(远程攻击 —— 发射子弹)
学习·游戏·c#
weixin_4280053020 小时前
C#调用 AI学习从0开始-第1阶段(基础与工具)-第7天多轮对话记忆
人工智能·学习·c#·多轮对话·千问api调用
z落落21 小时前
C# 数组属性和方法(Clear / Copy / IndexOf / LastIndexOf)
开发语言·javascript·c#
IT空门:门主21 小时前
Java 单例模式详解:7 种实现方式 + volatile 原理 + 反射与序列化问题
java·开发语言·单例模式
光泽雨1 天前
LINQ 语言集成查询 (Language Integrated Query)
c#·linq
吴可可1231 天前
C++与C#版Teigha样条离散化差异解析
c++·算法·c#
郝学胜-神的一滴1 天前
中级OpenGL教程 007:解决背面光照异常高光问题
c++·unity·游戏引擎·three.js·opengl·unreal