DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录

抽象工厂模式

思维导图

接口(抽象类)

工厂接口

抽象产品类

抽象武器接口

抽象人物接口

具体工厂和具体产品

具体工厂

(1)产品接口,生成具体人物

(2)武器接口,生成具体武器

具体产品的实现

Soldier类型

ShotGunA 类型

单例模式资源加载

测试

GameController

PerformanceTest


抽象工厂模式

思维导图

一个工厂里面可以生产多个产品

一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量

接口(抽象类)

工厂接口

在工厂里声明创造的武器和产品

武器:创造武器方法创造具体的武器

人物:创造产品方法创造具体的人物

public interface IGameFactory
{IWeapon GreateWeapon();ICharacter CreateCharacter();
}

抽象产品类

抽象武器接口

用来生产不同的武器,武器类型

/// <summary>
/// 抽象武器接口-抽象产品
/// </summary>
public interface IWeapon
{void Use();//使用武器void Display();//显示武器
}
抽象人物接口

用来生成不同的产品,人物类型

/// <summary>
/// 抽象产品
/// </summary>
public interface ICharacter
{void Display();//显示模型
}

具体工厂和具体产品

现代风格的具体工厂,返回具体的产品

具体工厂

(1)产品接口,生成具体人物

返回要生成的产品,Soldier类型

(2)武器接口,生成具体武器
public class ModernGameFactory : IGameFactory
{public ICharacter CreateCharacter(){return new Soldier();}public IWeapon GreateWeapon(){return new ShotGunA();}
}

具体产品的实现

Soldier类型

实现ICharacter接口,生产具体的人物

/// <summary>
/// 具体产品---士兵
/// </summary>
public class Soldier : ICharacter
{private GameObject _model;public Soldier(){_model = ResourceManager.Instance.GetResource("Bot/SoldierA");}public void Display(){if (_model != null){GameObject.Instantiate(_model);}else{Debug.LogError("Soldier model not found");}}
}

ShotGunA 类型

ShotGunA产品的生产

实现IWeapon接口

public class ShotGunA : IWeapon
{private GameObject _model;public ShotGunA(){_model = ResourceManager.Instance.GetResource("Weapon/LaserGun_A");}public void Display(){if (_model != null){GameObject.Instantiate(_model);}else{Debug.LogError("ShotGunA model not found");}}public void Use(){Debug.Log("使用武器");}
}

单例模式资源加载

单例模式(Singleton Pattern):是一种创建对象的设计模式,确保一个类只有一个实例,并提供全局访问点。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 单例模式
/// </summary>
public class ResourceManager
{//本类实例的引用private static ResourceManager _instance;//资源缓存器private Dictionary<string, GameObject> _resourceCache = new Dictionary<string, GameObject>();//为私有的字段准备的属性public static ResourceManager Instance{get//保证有且只有一个实例{if (_instance == null){_instance = new ResourceManager();}return _instance;}}//获取资源的工作代码,从硬盘或者缓存中获取模型资源//传入路径pathpublic GameObject GetResource(string path){//询问资源存储器中是否包含当前路径(不需要重复加载)if (!_resourceCache.ContainsKey(path)){GameObject resource = Resources.Load<GameObject>(path);if (resource == null){Debug.LogError($"Failed to load resource at path: {path}");return null;}_resourceCache[path] = resource;}return _resourceCache[path];}
}

测试

GameController

建个空物体挂上即可

功能:创建产品进行测试

public class GameController : MonoBehaviour
{private ICharacter _character;private IWeapon _weapon;public void StartGame(IGameFactory factory){try{_character = factory.CreateCharacter();          _weapon = factory.GreateWeapon();_character.Display();_weapon.Use();}catch (System.Exception e){Debug.LogError($"Error starting game: {e.Message}");}}
}

PerformanceTest

建个空物体挂上即可

功能:测试用抽象工厂模式创建物体和直接实例化物体的时间性能区别

(直接创建会快)

public class PerformanceTest : MonoBehaviour
{private void Start(){//TestDirectInstantiation(500);TestFactoryPattern(500);}//直接实例化void TestDirectInstantiation(int count){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();List<GameObject> objects = new List<GameObject>();GameObject prefab = Resources.Load<GameObject>("Bot/SoldierA");for (int i = 0; i < count; i++){objects.Add(GameObject.Instantiate(prefab));}stopwatch.Stop();UnityEngine.Debug.Log($"Direct Instantiation ({count} objects): {stopwatch.ElapsedMilliseconds} ms");// Clean upforeach (var obj in objects){GameObject.Destroy(obj);}objects.Clear();Resources.UnloadUnusedAssets();}//抽象工厂的实例化测试void TestFactoryPattern(int count){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();IGameFactory factory = new ModernGameFactory();List<ICharacter> characters = new List<ICharacter>();for (int i = 0; i < count; i++){characters.Add(factory.CreateCharacter());characters[i].Display();}stopwatch.Stop();UnityEngine.Debug.Log($"Factory Pattern ({count} objects): {stopwatch.ElapsedMilliseconds} ms");//Clean upcharacters.Clear();Resources.UnloadUnusedAssets();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430617.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 vxe-grid 通过数据库返回的列信息,生成columns,并且其中有一列是img类型,进行slots的格式化处理。

1、一般我们写死的列信息的时候&#xff0c;会这样定义&#xff1a; 2、然后我们在template里面&#xff0c;这样这样写slots格式化部分&#xff1a; 这样表格中就会展示出一张图片&#xff0c;并且&#xff0c;我们点击了可以查看大图。 3、那么我们从数据库中返回的列&#…

maxwell 输出消息到 kafka

文章目录 1、kafka-producer2、运行一个Docker容器&#xff0c;该容器内运行的是Zendesk的Maxwell工具&#xff0c;一个用于实时捕获MySQL数据库变更并将其发布到Kafka或其他消息系统的应用3、进入kafka容器内部4、tingshu_album 数据库中 新增数据5、tingshu_album 数据库中 更…

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附&#xff1a;安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible&#xff0c;ansible-navigator7.2 部署ansibl…

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…

清华大学开源视频转文本模型——CogVLM2-Llama3-Caption

通常情况下&#xff0c;大多数视频数据并不附带相应的描述性文本&#xff0c;因此有必要将视频数据转换为文本描述&#xff0c;为文本到视频模型提供必要的训练数据。 CogVLM2-Caption 是一个视频字幕模型&#xff0c;用于为 CogVideoX 模型生成训练数据。 文件 使用 import i…

计算机毕业设计 校运会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

一、引言 有很多工具可以分析FLV格式&#xff0c;这里推荐flvAnalyser。其支持&#xff1a; 1.FLV 文件分析&#xff08;Tag 列表、时间戳、码率、音视频同步等&#xff09;&#xff0c;HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01)&#xff1b; 2.RTMP/HTT…

Linux突发网络故障常用排查的命令

测试环境 系统&#xff1a;Ubuntu 18硬件&#xff1a;单核2G ping 用于测试客户机和目标主机通信状况&#xff0c;是否畅通。以及测量通信的往返时间&#xff0c;判断网络质量的好坏。 它通过发送ICMP回显请求消息到目标主机&#xff0c;并等待返回的ICMP回显回复消息。 pin…

DeiT:Data-efficient Image Transformer(2020),基于新型蒸馏的ViT

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

k8s介绍-搭建k8s

官网&#xff1a;https://kubernetes.io/ 应用部署方式演变 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计…

简单的spring缓存 Cacheable学习

简单的spring缓存 Cacheable学习 1.需求 项目中有很多的方法查询的数据其实是不会经常变的&#xff0c;但是其整体的查询sql以及调用第三方数据获取数据花费的时间很长&#xff0c;现在考虑对此类型的接口进行优化&#xff0c;首先想到的是对其进行缓存操作&#xff0c;所以简…

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中&#xff0c;SEMCMS_Images.php的search参数&#xff0c;以及SEMCMS_Products.php的search参数&#xff0c;存在sql注入漏洞。 &#xff08;这个之前就有两个sql的cve&#xff0c;这次属于是捡漏了&#x1f6…

[vulnhub] Hackademic.RTB1

第一次打靶机&#xff0c;思路看的红队笔记 https://www.vulnhub.com/entry/hackademic-rtb1,17/ 环境&#xff1a;kali Linux - 192.168.75.131&#xff0c;靶机 - 192.168.75.132 主机发现和端口扫描 扫描整个网络有哪台机子在线&#xff0c;不进行端口扫描 nmap -sP 192.16…

JavaSE高级(3)——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

力扣周赛 —— 416

前言 只做出了第一道&#xff0c;第二第三道都超时。 痛&#xff0c;太痛了。 题目 Q1.举报垃圾信息 给你一个字符串数组 message 和一个字符串数组 bannedWords。 如果数组中 至少 存在两个单词与 bannedWords 中的任一单词 完全相同&#xff0c;则该数组被视为 垃圾信息。…

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中&#xff0c;我们想打印空格并不能直接敲一个空格键&#xff0c;因为如果是敲空格键&#xff0c;那无论你敲…

【已解决】ElementPlus 的 el-menu 组件如何用 js 控制展开某个子菜单,并在其他组件中控制使用呢?

文章目录 需求几次探索官网寻找线索&#xff08;解决办法&#xff09; 需求 我如何用代码来实现 ElementPlus 的菜单的展开和收缩呢&#xff1f; 几次探索 尝试通过找到节点之后&#xff0c;使用 click 事件&#xff0c;失败了 // 伪代码如下 const handleFindNodeAndClick …

vue Echart使用

一、在vue中使用Echarts 1.安装Echarts npm install echarts --save2.准备一个呈现图表的盒子 给盒子起名字是建议使用id选择器 这个盒子通常来说就是我们熟悉的 div &#xff0c;这个 div 决定了图表显示在哪里&#xff0c;盒子一定要指定宽和高 <div id"main&quo…

Scott Brinker:营销运营这一角色很棒可能会变得更棒;以下是关于相关职位的最新数据

营销运营职位晋升频繁 如果你在市场营销部门工作&#xff0c;生活可能相当不错。74%的营销人员表示&#xff0c;他们对自己的角色有些满意或非常满意。在过去的一年里&#xff0c;超过一半的人得到了晋升或找到了新工作。平均而言&#xff0c;他们的薪水比组织中其他类型的营销…