【设计模式】轻松了解单例模式

4 篇文章 0 订阅


前言

当我们项目中的代码越来越多时,就会出现一些复杂程度上或是代码逻辑上的问题,这时候就需要用一些固定的解决方案来帮助我们解决问题。这些解决方案不仅可以解决代码框架结构的问题,而且可以很好的降低代码之间的耦合度。这些解决方案就是设计模式。而单例模式就是设计模式中的一种。


一、啥子是单例模式?

在游戏开发过程中,编写的类并不是都会生成多个对象的,有时仅需要某些类生成唯一对象,比如游戏中的数据管理系统类,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:将改类构造方法改为私有化,创建一个唯一的对象,并向外界提供一个访问唯一对象的接口。


总结

合理的使用单例模式,能让我们更好操作和管理项目中的唯一对象!(本篇文章若有错误,欢迎指正!)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值