【設計模式】從游戲角度開始了解設計模式 --- 抽象工廠模式

在這里插入圖片描述

永遠記住,你的存在是有意義的,
你很重要,
你是被愛著的,
而且你為這個世界帶來了無可取代的東西。
-- 麥克西 《男孩、鼴鼠、狐貍和馬》--

從零開始了解設計模式

  • 抽象工廠模式

抽象工廠模式

今天我們一起來探究抽象工廠模式,這是對工廠模式的進階實現。通常我們將工廠模式與抽象工廠模式比作一維數組與二維數組。

工廠模式我們可以創建出一種類別的實例,而如果我們此時這種類別存在若干個變種,這時就可以通過抽象工廠模式進行創建。

比如現在正在制作一塊魔幻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…