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

news2024/12/29 5:20:13

文章目录

    • 简介
    • 实例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.coloradmin.cn/o/1404680.html

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

相关文章

canvas绘制旋转的椭圆花

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式(Proxy Pattern) 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁,但不推荐) 2.基于CGLIB实现 spring中应用 …

第137期 Oracle的数据生命周期管理(20240123)

数据库管理137期 2024-01-23 第137期 Oracle的数据生命周期管理(20240123)1 ILM2 Heat Map3 ADO4 优点5 对比总结 第137期 Oracle的数据生命周期管理(20240123) 作者:胖头鱼的鱼缸(尹海文) Orac…

图灵日记之java奇妙历险记--异常包装类泛型

目录 异常概念与体系结构异常的分类异常的处理防御式编程异常的抛出异常的捕获异常声明throwstry-catch捕获并处理 自定义异常类 包装类基本数据类型及其对应包装类装箱和拆箱 泛型泛型使用类型推导 裸类型说明 泛型的编译机制泛型的上界语法 异常概念与体系结构 在java中,将程…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS数据排序

《SPSS统计学基础与实证研究应用精解》4.6 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.6节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。本书旨在手把手教会使…

智能机器人与旋量代数(9)

Chapt 3. 螺旋运动与旋量代数 3.1 螺旋运动 螺旋运动是关于一条空间直线的一个旋转运动,并伴随沿此直线的一个平移。是一种刚体绕空间轴 s s s旋转 θ \theta θ角,再沿该轴平移距离 d d d的复合运动,类似螺母沿螺纹做进给运动的情形。 一…

x-cmd pkg | dasel - JSON、YAML、TOML、XML、CSV 数据的查询和修改工具

目录 简介首次用户快速实验指南基本功能性能特点竞品进一步探索 简介 dasel,是数据(data)和 选择器(selector)的简写,该工具使用选择器查询和修改数据结构。 支持 JSON,YAML,TOML&…

SQL提示与索引终章

✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL-进阶篇 📜 感谢大家的关注! ❤️ 可以关注黑马IT,进行学习 目录 🚀SQL提示 🚀覆盖索引 🚀前缀索引 &…

科技、文化与旅游的融合创新:智慧文旅的未来之路

在当今社会,科技、文化与旅游的融合已经成为文旅产业转型升级的重要趋势。这种融合不仅有助于提升文旅产业的核心竞争力,更有助于推动产业的数字化转型和可持续发展。 本文将深入探讨科技、文化与旅游的融合创新,以及智慧文旅场景的解决方案…

Unity3d引擎中使用AIGC生成的360全景图(天空盒)

前言 在这里与Skybox AI一起,一键打造体验无限的360世界,这是这个AIGC一键生成全景图的网站欢迎语。 刚使用它是23年中旬,在没有空去给客户实地拍摄全景图时,可以快速用它生成一些相关的全景图,用作前期沟通的VR de…

【第十四课】并查集(acwing-837连通块中点的数量 / c++代码 / 思路详解)

目录 思路 代码如下 一些解释 思路 由于这道题是在并查集这个知识点下面,所以自然我们直接将无向图及之间连线的表示模型化为我们并查集的模板(或许其实也并不难想到?),要解释一下的话就是:我们将无向图中的每个顶点当作一个集合&…

JSON简单了解

文章目录 1、JSON介绍2、ES6模版字符串3、JS对象转化为JSON字符串3.1、手动JS对象转化为JSON字符串3.2、自动JS对象转化为JSON字符串 4、JS对象和java互相转换 1、JSON介绍 JSON 概念:JavaScript Object Notation。JavaScript 对象表示法,简单理解JSON是…

C++参悟:数值运算相关

数值运算相关 一、概述二、常用数学函数1. 基础运算1. 浮点值的绝对值( |x| )2. 浮点除法运算的余数3. 除法运算的有符号余数4. 除法运算的有符号余数和最后三个二进制位5. 混合的乘加运算6. 两个浮点值的较大者7. 两个浮点值的较小者8. 两个浮点值的正数…

个人云服务器docker搭建部署前后端应用-myos

var code "87c5235c-b551-45bb-a5e4-9593cb104663" mysql、redis、nginx、java应用、前端应用部署 本文以单台云服务器为例: 1. 使用腾讯云服务器 阿里或其他云服务器皆可,类似 安装系统,现在服务器系统都集成安装了docker镜像&a…

仓库管理系统

仓库管理系统 项目环境要求 1.设备支持:Windows7、Windows8或Windows10; 2.数据库:Mysql 8.0; 3.软件支持:eclipse、navicat 需求分析 需求分析阶段的根本任务是要明确仓库管理系统功能需求,以便提出整个系…

Mapbox加载浙江省天地图服务和数据处理

1. 加载影像服务 通过浙江省天地图官网申请所需服务,使用token获取服务数据 由于浙江省天地图使用的坐标系是 cgcs2000,需要使用 的框架对应为 cgcs2000/mapbox-gl,通过cdn引入或npm下载 影像服务地址为: ‘https://ditu.zjzw…

2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍

第一天第二天第三天 1.1 引入方式 1.2 选择器 1.3 画盒子 1.4 文字控制 1.5 综合案例 一 新闻详情 2.1 复合选择器 2.2 伪类选择器 2.3 CSS 特性 2.4 Emmet 写法 2.5 背景属性 2.6 显示模式 2.6 综合案例 一 热词 (设计稿?) 2.7 综合案例 一…

优化用户体验测试应用领域:提升产品质量与用户满意度

在当今数字化时代,用户体验测试应用已经成为确保产品质量、提升用户满意度的关键工具。随着技术的不断发展,用户的期望也在不断演变,因此,为了保持竞争力,企业必须将用户体验置于产品开发的核心位置。本文将探讨用户体…

耳鸣是怎么回事呢?

什么是耳鸣? 耳鸣是指在没有任何客观声响的情况下,个人主观上却感觉听到声音,有些人甚至觉得声音来自头部。耳鸣的感觉因人而异,声音多种多样。比如明明没有开任何电器,但却可以感觉到电流声,明明旁边没有…

如何使用固定公网地址访问多个本地Nginx服务搭建的网站

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 本文主要介绍如何在Windows系统对Nginx进行配置,并结合cpolar内网穿透工具实现固定公网地址远程访问多个本地站…