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.hqwc.cn/news/421524.html

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

相关文章

Go使用记忆化搜索的套路【以20240121力扣每日一题为例】

题目 分析 这道题很明显记忆化搜索,用py很容易写出来 Python class Solution:def splitArray(self, nums: List[int], k: int) -> int:n len(nums)# 寻找分割子数组中和的最小的最大值s [0]for num in nums:s.append(s[-1] num)#print(s)cachedef dfs(cur,…

140:leaflet加载here地图(v2软件多种形式)

第140个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加HERE地图(v2版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制下面的 vue+leaf…

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组,乘法器最重要的设计是改变部分积的数量,另外在考虑有符号数的情况下,最高位符号位有特别的意义。 (注:部分积是指需要最后一起加和的所有部分…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR)

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR) 1. 数学推导2. 案例反洗与代码详解 1. 数学推导 2. 案例反洗与代码详解

深度了解六西格玛培训:用MINITAB软件优化数据处理和项目管理——张驰咨询

在追求卓越的道路上,六西格玛培训不仅是一种管理哲学,更是一套科学精细的工具箱。它起源于摩托罗拉的制造车间,但如今它的精粹已经应用到各个行业,无论规模大小,都在追求完美的产品和服务质量。 在张驰咨询&#xff0…

知识图谱的演进

目录 前言1 Memex:信息存储的雏形2 超文本和Web:链接的崛起3 Semantic Web:从文本链接到数据链接4 Linked Big Data:规范化的语义表示5 谷歌的知识图谱搜索引擎6 多种语义网/知识图谱项目结语 前言 随着人工智能和互联网的飞速发…

到店商详架构变迁

一、项目背景 到店商详是平台为京东到店业务提供的专属商详页面,将传统电商购物路径打造成以LBS门店属性的本地生活服务交易链路。 二、架构变迁 1、 主站商详扩展点 **优点:**到店侧仅关注业务,无需过度关注服务部署、性能优化等。 **缺…

一文学会Python中的while循环

Python 中的 while 循环是一种用于重复执行代码块的控制结构,它会根据条件的真假来决定是否继续执行循环。本文将深入探讨 Python 中的 while 循环,包括其基本语法、应用场景以及一些示例代码。 基本语法 在 Python 中,while 循环的基本语法…

持续集成工具Jenkins的使用之配置篇(二)

上一篇 :持续集成工具Jenkins的安装配置之安装篇(一)-CSDN博客 接上文 三.Jenkins配置 Jenkins配置主要是针对创建构建任务前做的一些基本配置,这些配置有些是必须的,有些是可以帮我们提高效率的,总之都是Jenkins管理员都要会的…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(1)

文章目录 🏆 初识人工智能(机器学习之逻辑回归)🔎 一、 机器学习之逻辑回归知识文集(1)🍁 01. 什么是逻辑回归?它与线性回归的区别是什么?🍁 02. 逻辑回归的应用场景有哪些?🍁 03. 逻…

【Web前端开发基础】CSS的盒子模型

CSS的盒子模型 一、学习目标 能够认识不同选择器的优先级公式能够进行CSS权重叠加计算,分析并解决CSS 冲突问题能够认识盒子模型的组成部分能够掌握盒子模型的边框、内边距、外边距的作用及简写形式能够计算盒子的实际大小能够了解外边距折叠现象,并知…

百果园上市一年股价腰斩,千亿营收“大饼”画不动了?

作为国内最大的水果零售商,深圳百果园实业(集团)股份有限公司(下称“百果园”,02411.HK)遭遇股价暴跌。 1月16日,百果园开盘后股价大幅跳水,盘中一度跌超34%,最低触及3.…