前言
当我们项目中的代码越来越多时,就会出现一些复杂程度上或是代码逻辑上的问题,这时候就需要用一些固定的解决方案来帮助我们解决问题。这些解决方案不仅可以解决代码框架结构的问题,而且可以很好的降低代码之间的耦合度。这些解决方案就是设计模式。而单例模式就是设计模式中的一种。
一、啥子是单例模式?
在游戏开发过程中,编写的类并不是都会生成多个对象的,有时仅需要某些类生成唯一对象,比如游戏中的数据管理系统类,UI管理系统类,游戏场景管理系统类等,这些类往往只需要一个对象,而保证一个类只有一个对应的对象,并提供一个访问该对象的方法,这就是单例模式!
二、注意看!这有个非单聊与单例的对比!
我们以一个独立游戏中的任务管理系统为例,它在游戏中可以保存所有玩家接受的任务。
以下是两种方式的实现。
非单例模式代码
让我们来瞅瞅非单例模式的代码
using System.Collections.Generic;
using UnityEngine;
//创建任务类
public class Task
{
public string task_Name;
}
//创建任务管理类
public class TaskManager
{
private List<Task> taskList = new List<Task>();
public void AddTask(string name)
{
Task task = new Task();
task.task_Name = name;
taskList.Add(task);
}
//查看任务方法
public void Check_TaskName()
{
foreach (Task task in taskList)
{
Debug.Log(task.task_Name);
}
}
}
public class Singleton : MonoBehaviour
{
void Start()
{
AddTaskToList();
CheckTaskFromList();
}
void AddTaskToList()
{
TaskManager taskManager = new TaskManager();
taskManager.AddTask("one");
taskManager.AddTask("two");
}
void CheckTaskFromList()
{
TaskManager taskManager = new TaskManager();
taskManager.Check_TaskName();
}
}
运行以上代码,我们会发现没有一个任务名字被输出,仔细查看代码过后会发现一个明显的问题,我们在执行 AddTaskToList() 方法和 CheckTaskFromList() 方法时分别调用的是两个任务管理类对象,这就导致每个方法调用时都会实例化一个新的 任务管理类,那我们还怎么统一管理我们的任务呢?
单例模式代码
为了避免上述情况, 我们的单例模式就来了!
using System.Collections.Generic;
using UnityEngine;
//创建任务类
public class Task
{
public string task_Name;
}
//创建任务管理类
public class TaskManager
{
//创建唯一的对象
private static TaskManager instance = null;
private List<Task> taskList = new List<Task>();
//向外界提供一个访问唯一对象的接口
public static TaskManager Instance
{
get
{
//判断当前有没有该对象,如果有直接返回,没有的话创建一个,保证唯一性
if (instance == null)
{
instance = new TaskManager();
}
return instance;
}
}
//私有化构造方法,防止外界实例化该对象
private TaskManager() { }
public void AddTask(string name)
{
Task task = new Task();
task.task_Name = name;
taskList.Add(task);
}
//查看任务方法
public void Check_TaskName()
{
foreach (Task task in taskList)
{
Debug.Log(task.task_Name);
}
}
}
public class Singleton : MonoBehaviour
{
void Start()
{
AddTaskToList();
CheckTaskFromList();
}
void AddTaskToList()
{
TaskManager.Instance.AddTask("one");
TaskManager.Instance.AddTask("two");
}
void CheckTaskFromList()
{
TaskManager.Instance.Check_TaskName();
}
}
运行上述代码,我们可以发现任务名称被可以被正常输出。这既是将 TaskManager 类修改为单例类后的效果。
Unity组件类如何改为单例类
在Unity中,如果我们想把组件类改为单例类,方法与修改普通类有些许不同,具体代码如下
using UnityEngine;
public class NewScript : MonoBehaviour
{
public static NewScript Instance;
void Awake()
{
Instance = this;
}
}
三、如何使用单例模式
使用单例模式的大概思路为下:
1:创建一个类 (上文中的 TaskManager 类)
2:将改类构造方法改为私有化,创建一个唯一的对象,并向外界提供一个访问唯一对象的接口。
总结
合理的使用单例模式,能让我们更好操作和管理项目中的唯一对象!(本篇文章若有错误,欢迎指正!)