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.mfbz.cn/a/339387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高效减少组织自发荧光,提高信噪比

在免疫组化检测过程中,许多样本组织会产生可通过各种波长滤光片的组织内源性自发荧光,干扰抗体标记的目的蛋白荧光的观察,甚至导致实验失败。为了解决免疫组化实验中的自发荧光,VectorLabs公司(国内代理商欣博盛生物&a…

【OCR项目】之用HALCON的深度学习工具进行文字识别,并导出到C++调用

前言 HALCON是一个强大的机器视觉工具,包含了2D,3D图像各种算子,以及各种任务的深度学习工具,包括目标检测,实例分割,文字识别等。 这次从实际生产的角度,来分享一下如何用HALCON进行文字识别…

python for循环的基础及面试题

当前版本: Python 3.8.4 简介 for 循环是一种重复执行特定代码块的控制流结构。它可以遍历序列(例如列表、元组、字符串)或其他可迭代对象(例如字典、集合)中的元素。每次迭代循环时,会将元素赋值给一个变…

scipy通过快速傅里叶变换实现滤波

文章目录 fft模块简介fft函数示例滤波 fft模块简介 scipy官网宣称,fftpack模块将不再更新,或许不久之后将被废弃,也就是说fft将是唯一的傅里叶变换模块。 Fourier变换极其逆变换在数学上的定义如下 F ( ω ) ∫ − ∞ ∞ f ( t ) e − i ω…

C++中的static(静态)

2014年1月19日 内容整理自The Cherno:C系列 2014年1月20日 内容整理自《程序设计教程:用C语言编程 第三版》 陈家骏 郑滔 -----------------------------------------------------------------------------------------------------------------------------…

猛玛LARK M1无线麦克风采用 思远半导体 其实就是蓝牙话筒

自上世纪无线电技术开始发展起来,到了几十年后的今天,无线通讯技术已经成熟,开始追求更好的音质以及用户使用体验,优秀的产品也如雨后春笋般的出现,技术革新,极致音质,竞争也越来越激烈。这时候…

LMDeploy 大模型量化部署实践

文章目录 核心功能量化推理引擎推理服务 量化原理补充 部署: 在设备上运行起来,能够接受输入,返回输出。 最重要的就是性能和效率方面的考虑。大模型也是模型的一种,内存开销大,7b 要14G左右的显存。 因为是自回归的方…

Linux:使用for+find查找文件并cp到其他目录,文件名带有空格

一、场景描述 在终端窗口中,用shell命令,批量拷贝文件到指定目录。 我是在Windows系统上,通过git bash终端来执行shell命令的。 二、实现过程 命令1 for filepath in find /d/LearningMaterials/数学/数学/高中/一数/偏基础(基…

MySQL的下载、安装、配置、登录,配置(图+文)(超级详细)

一、 软件的下载 1. 下载地址 官网: https://www.mysql.com 2. 打开官网,点击 DOWNLOADS 然后,点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 4. 在 General Availability(GA) Releases 中选择适合的版本 …

基于SpringBoot的智慧社区居家养老健康管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

【Unity小技巧】3D人物移动脚步和跳跃下落音效控制

文章目录 单脚步声多脚步声,跳跃落地音效播放不同材质的多脚步声完结 单脚步声 public AudioClip walkingSound; public AudioClip runningSound;//移动音效 public void MoveSound() {// 如果在地面上并且移动长度大于0.9if (isGround && moveDirection.s…

上位机图像处理和嵌入式模块部署(qt图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多人一想到图像处理,本能的第一反应就是opencv,这也没有错。但是呢,这里面还是有一个问题的,不知…

利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装后不能调用pytorch和paddlepaddle框架

问题现象: 之前安装后不能在添加pytorch和paddlepaddle框架 原因(疑似): 在终端中显示pytorch和paddle在C盘但是安装是安装在J盘 解决办法: 卸载、删除文件重新安装后可以看到文件位置在J盘中 但是选择时还是显示C…

JavaEE中什么是Web容器?

Web容器(也称为Servlet引擎)是一个用于执行Java Servlet和JSP的服务器端环境。它负责管理和执行在其上运行的Web应用程序。 Tomcat是Web容器 Apache Tomcat 是一个流行的开源的Web容器,它实现了Java Servlet和JavaServer Pages(…

Linux中的软件包管理器yum

目录 1.什么是软件包 2.关于 rzsz 3.查看软件包 4.如何安装软件 5.如何卸载软件 1.什么是软件包 ● 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. ● 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理…

《WebKit 技术内幕》之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程:首先检测事件发生处的元素有无监听者,如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件(浏览器对于有些事件必须响应…

【GitHub项目推荐--智能家居项目】【转载】

如果你具备硬件、软件知识,这个项目肯定符合你的胃口。 物美智能是一套软硬件结合的开源项目,该系统可助你快速搭建自己的智能家居系统。你可以学习到设备的集成和软硬件交互。 PC 端或者手机与服务端通信,单片机可以接受遥控设备和服务器的…

【C++干货基地】namespace超越C语言的独特魅力(文末送书)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

【后端】深入浅出Node.js

文章目录 1.Node简介1.1 诞生历程1.2 阻塞IO和异步IO 【后端目录贴】 1.Node简介 1.1 诞生历程 Node特点 事件驱动、非阻塞I/O node和chrome浏览器区别 除了HTML、WebKit和显卡这些UI相关技术没有支持外,Node结构与Chrome十分相似,他们都是基于事件驱动…

echarts dataZoom实现左右滑动与放大缩小 并精确控制显示几条数据

//Xdata是横轴的长度(若x轴80条数据,默认显示最新的20条) var start Xdata.length - 20; var end Xdata.length - 1; dataZoom: [ type: slider, show: true, startValue: dataZoomStart, endValue: dataZoomEnd, dataBackground: { ar…
最新文章