Unity 抽象工厂模式(实例详解)

文章目录

    • 简介
    • 实例1
    • 实例2

简介

抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组相关或相互依赖对象的创建过程,而无需指定具体类。这种模式常用于系统中有多组相关产品族,且客户端需要使用不同产品族中的对象时。
在Unity中,抽象工厂模式可以用于创建一组相关对象,例如不同类型的UI元素(按钮、文本框等)。这里给出一个简化版的实例:

实例1

首先,定义抽象工厂和抽象产品接口:

public interface IUIFactory
{IUIButton CreateButton();IUITextBox CreateTextBox();
}public interface IUIButton
{void Display();
}public interface IUITextBox
{void Display();
}

然后,实现两个具体的工厂类,每个对应一种风格的UI元素:

public class ModernUIFactory : IUIFactory
{public IUIButton CreateButton(){return new ModernUIButton();}public IUITextBox CreateTextBox(){return new ModernUITextBox();}
}public class RetroUIFactory : IUIFactory
{public IUIButton CreateButton(){return new RetroUIButton();}public IUITextBox CreateTextBox(){return new RetroUITextBox();}
}// 实现现代风格的具体按钮和文本框
public class ModernUIButton : IUIButton
{public void Display(){Debug.Log("Displaying a modern style button.");}
}public class ModernUITextBox : IUITextBox
{public void Display(){Debug.Log("Displaying a modern style text box.");}
}// 实现复古风格的具体按钮和文本框
public class RetroUIButton : IUIButton
{public void Display(){Debug.Log("Displaying a retro style button.");}
}public class RetroUITextBox : IUITextBox
{public void Display(){Debug.Log("Displaying a retro style text box.");}
}

最后,在客户端代码中使用抽象工厂来创建和操作UI元素:

public class UIManager
{private readonly IUIFactory _factory;public UIManager(IUIFactory factory){_factory = factory;}public void CreateAndDisplayUIElements(){var button = _factory.CreateButton();var textBox = _factory.CreateTextBox();button.Display();textBox.Display();}
}// 使用方式:
var modernManager = new UIManager(new ModernUIFactory());
modernManager.CreateAndDisplayUIElements(); // 输出现代风格的UI元素var retroManager = new UIManager(new RetroUIFactory());
retroManager.CreateAndDisplayUIElements(); // 输出复古风格的UI元素

在这个例子中,ModernUIFactoryRetroUIFactory 分别代表了两种不同的UI风格的抽象工厂。通过传递不同的工厂给 UIManager,我们可以根据需求动态创建并显示不同风格的UI元素,且不关心具体实现细节。如果未来需要添加新的UI风格,只需新增对应的工厂和产品类即可。

实例2

抽象工厂模式在很多场景下都具有实用价值,下面再举一个游戏开发中的例子:

假设我们正在开发一款支持多种主题(如:科幻、中世纪和卡通)的游戏,每种主题都有其独特的角色外观、武器外观和背景音乐。我们可以使用抽象工厂模式来处理不同主题资源的创建和管理。

public interface IThemeFactory
{ICharacter CreateCharacter();IWeapon CreateWeapon();ISoundtrack CreateSoundtrack();
}public interface ICharacter
{void Display();
}public interface IWeapon
{void Display();
}public interface ISoundtrack
{void Play();
}// 科幻主题实现
public class SciFiThemeFactory : IThemeFactory
{public ICharacter CreateCharacter(){return new SciFiCharacter();}public IWeapon CreateWeapon(){return new LaserGun();}public ISoundtrack CreateSoundtrack(){return new SpaceMusic();}
}// 中世纪主题实现
public class MedievalThemeFactory : IThemeFactory
{public ICharacter CreateCharacter(){return new Knight();}public IWeapon CreateWeapon(){return new Sword();}public ISoundtrack CreateSoundtrack(){return new MedievalMusic();}
}// 游戏客户端代码
public class GameClient
{private readonly IThemeFactory _themeFactory;public GameClient(IThemeFactory themeFactory){_themeFactory = themeFactory;}public void InitializeGame(){var character = _themeFactory.CreateCharacter();var weapon = _themeFactory.CreateWeapon();var soundtrack = _themeFactory.CreateSoundtrack();character.Display();weapon.Display();soundtrack.Play();}
}// 使用方式:
var sciFiGame = new GameClient(new SciFiThemeFactory());
sciFiGame.InitializeGame(); // 初始化并展示科幻主题的游戏元素var medievalGame = new GameClient(new MedievalThemeFactory());
medievalGame.InitializeGame(); // 初始化并展示中世纪主题的游戏元素

在这个例子中,IThemeFactory 是抽象工厂接口,它定义了创建游戏角色、武器和音乐的方法。而 SciFiThemeFactoryMedievalThemeFactory 则是具体工厂类,根据不同的主题生成相应的游戏元素。通过传递不同的工厂给 GameClient,可以灵活地切换游戏的主题风格,并且在不修改原有代码的情况下扩展新的主题。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

mysql事务日志和MVCC

1.mysql的redolog日志和undolog日志的作用? A redolog主要作用是保证提交commit的数据的成功 将修改的数据在正式提交commit前进行记录 记录的方式,将日志从内存刷新给文件缓存,文件缓存什么时候落盘由操作系统自行决定(2) redolog日志的主要…

Windows7关闭谷歌浏览器提示“若要接收后续 Google Chrome 更新,您需使用 Windows 10 或更高版本”的方法

背景 电脑比较老,系统一直没有更新,硬件和软件版本如下: 操作系统版本:Windows7 企业版 谷歌浏览器版本:109.0.5414.120(正式版本) (64 位) 该版本的谷歌浏览器是支持…

MySQL不同插入方式性能对比实验

最近负责的项目需要数据同步入库MySQL,为了测速那种入库方式效率比较高,为此进行了以下的对比实验,在此记录一下 实验表单数据格式 实验代码 共三种方法对比 mutiSqlInsert: 一条一条插入,最后一次提交 singleSqlInsert&…

LabVIEW滚动轴承故障在线监测

展示了如何将LabVIEW开发出一种有效的滚动轴承故障在线监测系统。介绍了该系统的开发过程、工作原理及其在实际应用中的效果。该系统成功地应用于对滚动轴承故障的早期诊断,提高了故障检测的准确性和效率。 滚动轴承在工作过程中会产生复杂的振动信号,包…

Proxmox VE 8 试装Oracle 23c

作者:田逸(formyz) Oracle 当前的最新版本是23c,虽然官方网站下载不了它的正式版本,但是却提供了一个性能受限的免费版本“Oracle Database 23.3 Free”(存储容量受限、内存使用受限)。这里就只…

[机缘参悟-129] :个人对人生之苦解决之道的思考

目录 前言: 第1层:环境层 1.1 环境的分类 1.2 理解环境的运作的基本原理 1.3 主动选择适合自己的愉快的环境 1.4 主动构建适合自己的愉快的环境 第2层:生理层 2.1 生理健康和情绪之间的关系 2.2 学习人的生物、生理、健康的基本知识…

MySQL与PostgreSQL对比

对比 许可证 License MySQL 社区版采用 GPL 许可证。Postgres 发布在 PostgreSQL 许可下,是一种类似于 BSD 或 MIT 的自由开源许可。 即便 MySQL 采用了 GPL,仍有人担心 MySQL 归 Oracle 所有,这也是为什么 MariaDB 从 MySQL 分叉出来。 …

学习使用 curl

一、简介 curl 是一个非常有用的网站开发工具。 curl 是常用的命令行工具——客户端(client)的 URL 工具——curl 用来请求 Web 服务器。 curl 支持多种协议。curl 命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界…

《Python数据分析技术栈》第06章使用 Pandas 准备数据 02 pandas的组件(Building blocks of Pandas)

02 pandas的组件(Building blocks of Pandas) 《Python数据分析技术栈》第06章使用 Pandas 准备数据 02 pandas的组件(Building blocks of Pandas) The Series and DataFrame objects are the underlying data structures in Pa…

数据出境——电商API接口使得电商数据跨境流动已成为趋势

在数字经济的当下,数据已经成为商业决策的关键因素。尤其是电商领域,电商API数据采集不仅关乎企业运营效率,还涉及到用户隐私与国家安全。近年来,随着电商市场的全球化发展,电商数据出境与跨境贸易已成为不可逆转的趋势…

使用Element-Plus 加载style

vue-chrome-extension 简介 chrome扩展开发插件基于vue3、ts、Element Plus、Webpack5、axios、less开发 支持content快速调用chrome对象及axios 详看 pages/content/app.vue 开箱即用chrome插件 特性 基础框架:使用 Vue3/Element PlusTypeScript: 应用程序级 J…

gin图片验证码

在开发的过程中,我们有些接口为了防止被恶意调用,我们会采用加验证码的方式,例如:发送短信的接口,为了防止短信接口被频繁调用造成损失;注册的接口,为了防止恶意注册。在这里为大家推荐一个验证…

C++:特殊类的设计和类型转换

特殊类的设计和类型转换 特殊类的设计1.设计一个类,不能被拷贝2.设计一个类,只能在堆上创建对象3.设计一个类,只能在栈上创建对象4.设计一个类,不能被继承5.单例模式 C的类型转换1. C语言中的类型转换2.C语言类型转换的缺点3.C的强…

vue3-模版引用ref

1. 介绍 概念&#xff1a;通过 ref标识 获取真实的 dom对象或者组件实例对象 2. 基本使用 实现步骤&#xff1a; 调用ref函数生成一个ref对象 通过ref标识绑定ref对象到标签 代码如下&#xff1a; 父组件&#xff1a; <script setup> import { onMounted, ref } …

Android Studio 之 菜单 Menu

选项菜单 OptionsMenu 用xml添加&#xff08;更建议使用&#xff09; 创建一个菜单布局 : 在 res文件下新建一个menu 目录&#xff0c;此时的菜单id为&#xff1a;R.menu.option <?xml version"1.0" encoding"utf-8"?> <menu xmlns:android&…

不同开发语言在进程、线程和协程的设计差异

不同开发语言在进程、线程和协程的设计差异 1. 进程、线程和协程上的差异1.1 进程、线程、协程的定义1.2 进程、线程、协程的差异1.3 进程、线程、协程的内存成本1.4 进程、线程、协程的切换成本 2. 线程、协程之间的通信和协作方式2.1 python如何实现线程通信&#xff1f;2.2 …

【Unity】AB包下载

【Unity】AB包下载 1.使用插件打AB包 a.AB包分类 一般地&#xff0c;将预制体作为AB包资源&#xff0c;不仅需要对预制体本身进行归类&#xff0c;还要对其涉及的动画&#xff08;AnimationClip&#xff09;、动画状态机&#xff08;AnimatorController&#xff09;、以及所…

144.二叉树的前序遍历

递归 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list new ArrayList<>();traversal(root, list);return list;}public void traversal(TreeNode t, List<Integer> list) {if (t null) {return;}list.add(t.val);trave…

《A++ 敏捷开发》- 5 量化管理从个人开始

我&#xff1a;你们管理层和客户都比较关心项目的进度&#xff0c;项目是否能按时完成&#xff1f;请问你们过去的项目如何&#xff1f; 开发&#xff1a;我们现在就是走敏捷开发&#xff0c;两周一个迭代。每次迭代前&#xff0c;我们聚一起开会&#xff0c;把所有用户故事按优…

2024.1.19力扣每日一题——使数组和小于等于 x 的最少时间

2024.1.19 题目来源我的题解方法一 动态规划方法二 动态规划&#xff08;空间优化&#xff09; 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2809 我的题解 题解参考官方题解。 方法一 动态规划 若能找到一个最小的时间t使得数组和小于等于x&#xff0c;则最多在一轮…