在这里插入图片描述

永远记住,你的存在是有意义的,
你很重要,
你是被爱着的,
而且你为这个世界带来了无可取代的东西。
-- 麦克西 《男孩、鼹鼠、狐狸和马》--

从零开始了解设计模式

  • 抽象工厂模式

抽象工厂模式

今天我们一起来探究抽象工厂模式,这是对工厂模式的进阶实现。通常我们将工厂模式与抽象工厂模式比作一维数组与二维数组。

工厂模式我们可以创建出一种类别的实例,而如果我们此时这种类别存在若干个变种,这时就可以通过抽象工厂模式进行创建。

比如现在正在制作一块魔幻rpg类型游戏,每个角色都有武器与防具两种装备。武器存在大剑,法杖,拳套等,防具有护盾,魔法书,披风等。对于这个背景,就有两个维度。为了实现这个功能可以如下设计:

#include<iostream>using namespace std;
//装备基类
class Weapon {
public:virtual void use() = 0;
};
//防具基类
class Armour {
public:virtual void equip() = 0;
};//大剑
class Sword : public Weapon{
public:void use() {cout << "use sword" << endl;}
};
//法杖
class Staff : public Weapon {
public:void use() {cout << "use staff" << endl;}
};//护盾
class Shield : public Armour {
public:void equip() override {cout << "equip shield" << endl;}
};
//斗篷
class Cloak : public Armour {
public:void equip() {cout << "equip cloak" << endl;}
};//角色装备工厂
class EquipmentFactory {
public:virtual Weapon* createWeapon() = 0;virtual Armour* createArmour() = 0;
};class WarriorFactory : public EquipmentFactory {
public:Weapon* createWeapon() override{return new Sword();}Armour* createArmour() override {return new Shield();}};class MageFactory : public EquipmentFactory {
public:Weapon* createWeapon() override {return new Staff();}Armour* createArmour() override {return new Cloak();}
};class Character {
public:Character(EquipmentFactory* factory) :_factory(factory),weapon(nullptr),armour(nullptr) {}//角色展现出来的装备特性void equip() {weapon = _factory->createWeapon();armour = _factory->createArmour();//调用装备使用方法weapon->use();armour->equip();}private:EquipmentFactory* _factory;Weapon* weapon = nullptr;Armour* armour = nullptr;
};int main() {//创建战士EquipmentFactory* warriorFactory = new WarriorFactory();Character warrior(warriorFactory);warrior.equip();EquipmentFactory* mageFactory = new MageFactory();Character mage(mageFactory);mage.equip();return 0;}

根据这个例子,我们可以总结一下抽象工厂的要素:

  1. 抽象产品:如weapon与Armour基类,约定了具体产品的接口声明,限制他们必须具有的功能
  2. 具体产品:如sword,staff ,shield类,这是实际发挥作用的产品,是最终被抽象工厂实例化的对象
  3. 抽象工厂:负责声明一组接口,来创建抽象产品。
  4. 具体工厂:具体工厂负责实例化具体产品。

抽象工厂模式通常在以下场景中使用:

  1. 跨平台GUI框架:qt, GTK+,wxWidgets对平台的不同组件进行封装
  2. 游戏引擎文件系统:不同操作系统上的文件操作api是不同的,当针对不同平台进行导出发布时,游戏引擎底层帮助我们完成了对不同平台文件读写的屏蔽与兼容。文件系统内部的writer与Reader读写器,就可以通过抽象工厂创建
  3. 游戏界面风格主题:针对不同主题实现不同UI组件的灵活切换。当版本更新或者活动上线时,可能需要对已有的界面组件在功能保持不变的情况下,对配色布局进行替换。这就需要我们通过抽象层来讲它与客户端代码解耦。
  4. 跨平台网络库:游戏引擎需要对不同系统的网络接口提供抽象与兼容。

再来看抽象工厂的优缺点

  • 优点:更多维度的可定制化,可以针对不同的产品变种提供具体的创建逻辑。
  • 缺点:更多的类,代码更多,抽象和理解的过程更加复杂。
  • 抽象工厂下的产品通常是协同工作的!

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

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

相关文章

tensorflow.js 使用场景

TensorFlow.js (简称 TF.js) 是一个利用 WebGL 和 Node.js 在浏览器和服务器端进行机器学习模型训练和部署(推理)的 JavaScript 库。它的核心价值在于将机器学习的能力带入了 Web 开发者和 JavaScript 生态的领域。 其主要应用场景可以分为以下几大类: 一、在浏览器中直接进…

详解mcp以及agen架构设计与实现

文章目录1.MCP概念2.MCP服务端主要能力3.MCP技术生态4.MCP与Function call区别5.MCP生命周期6.MCP java SDK7.MCP应用场景8.基于springAIollma阿里qianwenmcp设计私有AIAgent应用实现9.AI java项目落地技术选型10.构建AI Agent四大模块11.LLM(大模型)与MCP之间关系12.A2A、MCP、…

六级第一关——下楼梯

上目录&#xff1a; 目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 一、DP的意义以及线性动规简介 在一个困难的嵌套决策链中&#xff0c;决策出最优解。 二、动态规划性质浅谈 三、子序列问题 &#xff08;一&#xff09;一个序列中的最长上升子序列&am…

【Linux基础】Linux系统配置IP详解:从入门到精通

目录 1 Linux网络配置概述 2 网卡配置文件位置和命名规则 2.1 配置文件位置 2.2 网卡命名规则 2.3 配置文件命名示例 3 网卡配置文件详解 3.1 主要参数说明 4 Linux系统配置IP步骤 4.1 DHCP动态配置 4.2 静态IP配置 5 Linux网络配置流程 5.1 网络配置流程 5.2 网卡…

C语言sprintf的高效替代方案

C语言的sprintf和snprintf将变量格式化输出到内存buffer&#xff0c;其功能强大&#xff0c;用起来很方便。但sprintf系列函数的运行效率低下&#xff0c;主要包括四方面的原因&#xff1a;格式字符串解析、变参处理、locale&#xff08;本地化&#xff09;支持和通用&#xff…

【知识堂】制造业与物流数字化全景图:系统缩写大全与专业名词速查手册

前言在制造业和物流行业的数字化转型过程中&#xff0c;我们经常会接触到大量的 系统缩写&#xff08;如 ERP、MES、WMS…&#xff09;和 专业名词&#xff08;如 AGV、BOM、LOT…&#xff09;。 这些缩写往往让刚入行的人“一头雾水”&#xff0c;即使是有经验的从业者&#x…

利用JSONCrack与cpolar提升数据可视化及跨团队协作效率

文章目录前言1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址前言 JSONCrack 是一款功能强大的开源数据可视化工具&#xff0c;专为解析和展示复杂的 JSON、XML 等结构化数据…

CANoe入门之一 CANoe功能概述

01 CANoe功能概述 CANoe软件在汽车电子领域被广泛应用。 CANoe软件的全称是CAN Open Environment&#xff0c;它是一个专业的系统级总线和ECU仿真、分析、开发、测试工具。支持ECU或总线网络开发从需求分析到系统实现的全过程&#xff0c;包括模型创建、仿真、测试、诊断及通信…

项目管理核心八项(软件篇)

2025年09月11日23:50:33&#xff1a;进来常思&#xff0c;写代码也五六年了&#xff0c;后面的路该何去何从呢&#xff1f; 项目管理核心八项一、项目管理之“建立开发人员 backup 机制”二、待补充一、项目管理之“建立开发人员 backup 机制” “建立开发人员 backup 机制” 是…

springboot redisson 分布式锁入门与实战

Spring Boot3 Redisson 项目地址 https://gitee.com/supervol/loong-springboot-study &#xff08;记得给个start&#xff0c;感谢&#xff09; Redisson 介绍 在分布式系统中&#xff0c;多节点部署的应用对共享资源&#xff08;如数据库记录、缓存键、文件&#xff09;的…

使用 Tkinter + Requests 实现地理信息安全系统学习时长助手

✨重磅&#xff01;盹猫的个人小站正式上线啦&#xff5e;诚邀各位技术大佬前来探秘&#xff01;✨ 这里有&#xff1a; 硬核技术干货&#xff1a;编程技巧、开发经验、踩坑指南&#xff0c;带你解锁技术新姿势&#xff01;趣味开发日常&#xff1a;代码背后的脑洞故事、工具…

构建一个优雅的待办事项应用:现代JavaScript实践

构建一个优雅的待办事项应用&#xff1a;现代JavaScript实践本文将介绍如何使用现代JavaScript&#xff08;ES6&#xff09;和DOM操作创建一个功能完整的待办事项应用&#xff0c;无需任何外部库或框架。功能概述添加新任务标记任务为完成/未完成编辑任务内容删除任务过滤任务&…

【数据可视化-111】93大阅兵后的军费开支情况———2024年全球军费开支分析:用Python和Pyecharts打造炫酷可视化大屏

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

3.2.Maven-概述-介绍安装

一.介绍&#xff1a;二.安装&#xff1a;Maven的安装比较简单&#xff0c;因为他是绿色版的软件&#xff0c;官方给我们提供Maven的安装包就是一个zip压缩包&#xff0c;在进行Maven安装以及配置的时候&#xff0c;主要进行如下4步操作&#xff1a;第一步&#xff1a;把官方提供…

Kafka面试精讲 Day 14:集群扩容与数据迁移

【Kafka面试精讲 Day 14】集群扩容与数据迁移 在“Kafka面试精讲”系列的第14天&#xff0c;我们将深入探讨 Kafka 运维中最关键的操作之一&#xff1a;集群扩容与数据迁移。随着业务增长&#xff0c;原始 Kafka 集群可能面临磁盘不足、吞吐瓶颈或节点负载不均等问题&#xff…

字节一面 面经(补充版)

什么是RabbitMQ&#xff0c;特点是什么怎么理解保障消息的一致性String、StringBuffer、StringBuilder解释一下线程安全先操作数据库再删缓存还是先删缓存再操作数据库这种办法能杜绝数据不一致问题吗解释一下AOP介绍Redis的特点&#xff08;Redis比较快&#xff09;Redis为什么…

【MFC】对话框属性:Absolute Align(绝对对齐)

前言 本文介绍对话框属性中的Absolute Align(绝对对齐)&#xff0c;同时给出相关示例便于理解。 目录1 位置2 详解3 示例1 位置 首先介绍一下这个属性在哪里。 在资源视图中双击对话框节点&#xff0c;打开该对话框&#xff1b; 鼠标右键工作区空白处&#xff0c;单击属性&…

【从0开始学习Java | 第17篇】集合(中-Set部分)

文章目录Java集合之Set&#xff1a;无序不重复的元素容器一、Set接口的核心特性二、常用实现类及底层原理1. HashSet&#xff1a;基于哈希表的高效实现2. LinkedHashSet&#xff1a;保留插入顺序的哈希实现3. TreeSet&#xff1a;基于红黑树的排序实现三、实现类对比与选择建议…

玩转Docker | 使用Docker部署dufs文件管理工具

玩转Docker | 使用Docker部署dufs文件管理工具 前言 一、 dufs介绍 Dufs简介 核心特性 📁 静态文件服务 💾 文件夹打包下载 📤 拖拽上传文件/文件夹 ✏️ 文件在线创建、编辑与搜索 ⏳ 断点续传与部分传输 🔐 细粒度访问控制 🔒 HTTPS 安全传输 🌐 WebDAV 兼容支持…

【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之android 把assert里的dist.zip 包解压到sd卡里

一图胜千言 上一篇有 <!-- 读写外部存储 --> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"android:maxSdkVersion"28"/> <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE&qu…