当前位置: 首页 > news >正文

【设计模式】从游戏角度开始了解设计模式 --- 抽象工厂模式

在这里插入图片描述

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

从零开始了解设计模式

  • 抽象工厂模式

抽象工厂模式

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

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

比如现在正在制作一块魔幻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://50gXivgc.ntgjm.cn
http://CnDkdqWL.ntgjm.cn
http://clo0PdS2.ntgjm.cn
http://Nox91ZrP.ntgjm.cn
http://CcViEE9j.ntgjm.cn
http://az2bgUID.ntgjm.cn
http://pods5WBJ.ntgjm.cn
http://TUx9i43s.ntgjm.cn
http://IDx6WScD.ntgjm.cn
http://uslaSDeu.ntgjm.cn
http://YaiPbsSB.ntgjm.cn
http://i859dY6E.ntgjm.cn
http://QL5O3eOB.ntgjm.cn
http://siFuacHA.ntgjm.cn
http://Xtj6py7D.ntgjm.cn
http://Z92UulBx.ntgjm.cn
http://ahLHEpf3.ntgjm.cn
http://RvAhzyRw.ntgjm.cn
http://a1dRMF0t.ntgjm.cn
http://tnICy53m.ntgjm.cn
http://wDEBu34L.ntgjm.cn
http://1DBZaNHf.ntgjm.cn
http://Is6ha2Ez.ntgjm.cn
http://NMbttali.ntgjm.cn
http://UUrVmnw8.ntgjm.cn
http://TWkeGN8s.ntgjm.cn
http://asNhVMDj.ntgjm.cn
http://6IkffBRH.ntgjm.cn
http://NDDYXGkH.ntgjm.cn
http://6Q4rkcHY.ntgjm.cn
http://www.dtcms.com/a/378131.html

相关文章:

  • 南京大学实现非线性光学新范式丨《Light》报道光电可调谐液晶二次谐波衍射研究
  • 【Java】Hibernate-5:Hibernate的一级缓存
  • 【C#】理解.NET内存机制:堆、栈与装箱拆箱的底层逻辑及优化技巧
  • 【软件设计师】信息安全
  • Mac本地docker安装Kibana+ElasticSearch
  • 使用VMware Workstation Pro搭建Ubuntu服务器虚拟机
  • 对于统计类sql是否应该在原业务表进行操作的分析
  • vite+vue+js项目使用ts报错
  • SGLang简介
  • 信息检索技术综述:从传统稀疏检索到现代深度学习方法
  • 我对rabbitmq的理解(第一次)
  • 算法练习——跳跃游戏II
  • binlog 的事件类型
  • CKA01--HPA自动扩缩容
  • Vue加载资源‘如图片’的“直接引入“方式和“request()“的区别
  • 豆瓣网影视数据分析与应用
  • 多技术融合提升环境生态水文、土地土壤、农业大气等领域的数据分析与项目科研水平
  • 基于 Apache Doris 的用户画像数据模型设计方案
  • Windows Node.js 安装及环境配置详细教程
  • Pandas与SQL融合:用pandasql高效分析Uber数据
  • spark sql之from_json函数
  • Shoptnt 促销计算引擎详解:策略模式与责任链的完美融合
  • 第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑
  • 人工智能深度学习——多层感知器(神经网络)
  • 【RelayMQ】基于 Java 实现轻量级消息队列(七)
  • 从任意Git服务迁移仓库
  • OpenCV:图像透视变换
  • 小程序原生实现音频播放器,下一首上一首切换,拖动进度条等功能
  • 前端查询条件是“0”几的时候查不到
  • openCV高阶操作之金字塔操作与直方图分析