当前位置: 首页 > news >正文

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();}}

相关文章:

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

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…...

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…...

13_Python的高阶函数

高阶函数 高阶函数是Python编程中一个非常强大和有用的特性&#xff0c;它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数&#xff1a; 接受一个或多个函数作为输入&#xff08;也就是说&#xff0c;它的参数之一是函数&#…...

清空当前机器所有Docker容器和镜像

sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作&#xff0c;因为它会删除所有镜像&#xff0c;包括那些可能正在被容器使用的镜像。在执行此操作之前…...

FreeRTOS学习——Systick中断、SVC中断、PendSV中断

FreeRTOS学习——接口宏portmacro.h&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 port &#xff1a;GCC/ARM_CM7 文章目录 Systick源码触发方式 SVC源码触发方式 PendSV源码触发方式 相关汇编指令 Systick 源码 在Systick中断xPortSysTickHandler中&am…...

汇量科技大数据面试题及参考答案

如何在 SQL 中处理三个字段完全一样的去重?在 Scala 中又该如何实现? 在 SQL 中,可以使用多种方法来处理三个字段完全一样的去重。一种常见的方法是使用 DISTINCT 关键字结合多个字段来实现。例如,假设有表 table_name,包含字段 field1、field2 和 field3,可以使用以下 S…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.AVL树

1.AVL 树 1.1AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962…...

Python 的数据类型与操作

一、常用内置类型&#xff08;Built - in Types&#xff09; Python 拥有多种内置数据类型&#xff0c;这些类型满足了各种编程需求&#xff0c;从简单的数据存储到复杂的数据结构表示。 1. 数值类型&#xff08;Numeric Types&#xff09; 整数&#xff08;int&#xff09;&a…...

Python燃烧废气排放推断算法模型

&#x1f3af;要点 宏观能耗场景模型参数化输入数据&#xff0c;分析可视化输出结果&#xff0c;使用场景时间序列数据模型及定量和定性指标使用线图和箱线图、饼图、散点图、堆积条形图、桑基图等可视化模型输出结果根据气体排放过程得出其时间序列关系&#xff0c;使用推断模…...

Qt中多语言的操作(以QtCreator为例)

1、首先&#xff0c;我们在代码中与文本相关的且需要支持多语言的地方&#xff0c;用tr来包含多语言key&#xff08;多语言key是我们自己定义的&#xff09;&#xff0c;如下 //举例 QPushButton* btnnew QPushButton(this); btn->move(20,20); btn->resize(100,50); //…...

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

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

html+css学习

html 元素 html元素是HTML的根元素&#xff0c;一个文档只能有一个&#xff0c;其他所有元素都是其后代元素 html有一个属性为lang&#xff0c;其作用是&#xff1a; 帮助语言合成工具确定要使用的发音帮助翻译工具确定要使用的翻译规则 当属性lang“en”则表示告诉其浏览器…...

2.gitlab ce 细粒度的权限控制

需求&#xff1a; 在提交merge reqeust时&#xff0c;必须指定审核人&#xff0c;并且要选审核人清单里的 有个code owners应该可以做到&#xff08;gitlab ce应该也可以用&#xff09; 下面是参考的文档 细粒度的代码权限怎么做&#xff1f;极狐GitLab 代码所有者来帮忙 -…...

G - Merchant Takahashi / F - Useless for LIS

G - Merchant Takahashi 首先考虑暴力 DP。 设最后一步走到编号 ii 的城镇的方案的最大收益为 fifi​&#xff0c;则每次集市相当于是 fTi←fj−C∣Ti−j∣Pi&#xff08;1≤j≤n&#xff09;。 这样每次可以通过枚举 j 来转移&#xff0c;这样总时间复杂度是 O(nm) 的&…...

自然语言处理实例

引子:基于聊天机器人项目的自然语言处理(NLP)学习路线 自然语言处理(Natural Language Processing,简称 NLP)是人工智能的重要分支,旨在帮助计算机理解、生成和处理人类语言。NLP 技术广泛应用于搜索引擎、机器翻译、语音识别、文本摘要、情感分析、对话系统等领域。为…...

『功能项目』主角属性值显示【75】

本章项目成果展示 我们打开上一篇74穿戴装备的项目&#xff0c; 本章要做的事情是制作主角属性界面&#xff0c;实现在面板上显示主角的攻击力等数值 制作一个简易的主角界面&#xff08;创建Image与Text显示即可&#xff09; 创建一个空物体 重命名为PlayerInfo 在其子级下创…...

单片机嵌入式编程中常用技术点

Open CV&#xff0c;QT&#xff0c;Linux&#xff0c;多线程&#xff0c;网络编程&#xff0c;文件编程在单片机嵌入式编程中&#xff0c;这些技术在单片机嵌入式编程中的作用&#xff1a; 一、OpenCV 在单片机嵌入式编程中&#xff0c;虽然单片机的计算能力相对有限&#xf…...

【毕业论文+源码】基于ASP+NET的人事管理系统

引言 人事管理系统是针对企业内部人事管理设计&#xff0c;分角色实现对公司部门及各部门员工的增、删、改、查以及对员工考勤的管理。 编写目的&#xff1a; 在系统需求分析的基础上&#xff0c;对需求分析中产生的功能模块进行过程描述&#xff0c;设计功能模块的内部细节&…...

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

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

速通LLaMA2:《Llama 2: Open Foundation and Fine-Tuned Chat Models》全文解读

文章目录 概览LLaMA和LLaMA2的区别AbstractIntroductionPretrainingFine-tuning1. 概括2、Supervised Fine-Tuning&#xff08;SFT&#xff09;3、⭐Reinforcement Learning with Human Feedback&#xff08;RLHF&#xff09;&#x1f53a;总览Training Objectives&#xff1a;…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...