設計模式 Day 3:抽象工廠模式(Abstract Factory Pattern)詳解

經過前兩天的學習,我們已經掌握了單例模式與工廠方法模式,理解了如何控制實例個數與如何通過子類封裝對象的創建邏輯。

今天,我們將進一步深入“工廠”體系,學習抽象工廠模式(Abstract Factory Pattern),這是在實際項目中**用于創建“產品族”**的關鍵設計模式。


一、Day 1~2 回顧

? Day 1:單例模式

  • 保證一個類只有一個實例。
  • 適合日志系統、配置加載器、數據庫連接池等場景。
  • 推薦使用 C++11 局部靜態變量實現線程安全。

? Day 2:工廠方法模式

  • 將創建產品的職責下放給子類工廠。
  • 滿足開閉原則:添加新產品時只需新增具體工廠和產品類。
  • 適用于“產品種類多變”的系統結構。

二、抽象工廠模式簡介

在這里插入圖片描述

📌 定義:

抽象工廠模式提供一個接口,用于創建一系列相關或相互依賴的對象,而無需指定它們具體的類。

關鍵詞:“一系列相關對象” → 產品族

? 場景關鍵詞:

  • 多個產品類型(如按鈕、窗口)
  • 同一系列產品(如 Windows 風格、Mac 風格)
  • 產品之間存在匹配關系

三、類圖結構

             +------------------------+|   AbstractFactory      ||------------------------|| +createButton()        || +createCheckbox()      |+-----------+------------+|+-----------------+-----------------+|                                   |
+-------------+                   +----------------+
| WinFactory  |                   | MacFactory     |
+-------------+                   +----------------+
| +createButton() |              | +createButton() |
| +createCheckbox() |           | +createCheckbox()|產品結構(同理)
+-----------------+       +------------------+
| AbstractButton  |<------| WinButton        |
|                 |       | MacButton        |
+-----------------+       +------------------+

四、C++ 實現:跨平臺 UI 工廠

我們來設計一個跨平臺 GUI 庫,可以根據平臺生成不同風格的按鈕和復選框。

1. 抽象產品類

class Button {
public:virtual void paint() = 0;virtual ~Button() {}
};class Checkbox {
public:virtual void paint() = 0;virtual ~Checkbox() {}
};

2. 具體產品類

class WinButton : public Button {
public:void paint() override {std::cout << "繪制 Windows 風格按鈕" << std::endl;}
};class MacButton : public Button {
public:void paint() override {std::cout << "繪制 Mac 風格按鈕" << std::endl;}
};class WinCheckbox : public Checkbox {
public:void paint() override {std::cout << "繪制 Windows 風格復選框" << std::endl;}
};class MacCheckbox : public Checkbox {
public:void paint() override {std::cout << "繪制 Mac 風格復選框" << std::endl;}
};

3. 抽象工廠類

class GUIFactory {
public:virtual Button* createButton() = 0;virtual Checkbox* createCheckbox() = 0;virtual ~GUIFactory() {}
};

4. 具體工廠類

class WinFactory : public GUIFactory {
public:Button* createButton() override {return new WinButton();}Checkbox* createCheckbox() override {return new WinCheckbox();}
};class MacFactory : public GUIFactory {
public:Button* createButton() override {return new MacButton();}Checkbox* createCheckbox() override {return new MacCheckbox();}
};

5. 客戶端代碼

void render(GUIFactory* factory) {Button* btn = factory->createButton();Checkbox* chk = factory->createCheckbox();btn->paint();chk->paint();delete btn;delete chk;
}int main() {WinFactory win;MacFactory mac;render(&win);render(&mac);return 0;
}

五、優缺點分析

? 優點:

  • 保證產品族之間的一致性(按鈕和復選框風格統一)
  • 滿足開閉原則,支持新增平臺或產品族
  • 客戶端代碼不依賴具體產品類,低耦合

? 缺點:

  • 類數量增多,結構復雜
  • 不方便支持新增“產品種類”(比如再加個菜單類)

六、今日練習題

?? 題目一:

設計一個跨平臺圖標與窗口組件的 UI 系統,要求使用抽象工廠模式構造 IconWindow 兩類產品族,支持 Windows 與 Linux 兩個平臺。

?? 題目二:

抽象工廠模式和工廠方法模式的最大區別是什么?請簡潔說明并舉例。


七、小結與展望

抽象工廠模式適合管理“產品族”,比工廠方法更進一步封裝了對象創建的整體體系。掌握它有助于構建可擴展、可復用、風格一致的大型軟件系統。

明日預告:建造者模式(Builder Pattern) —— 用來構建“結構復雜對象”的強大模式,適合生成器、配置器類場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77457.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL:事務的理解

一、CURD不加控制&#xff0c;會有什么問題 &#xff08;1&#xff09;因為&#xff0c;MySQL里面存的是數據&#xff0c;所以很有可能會被多個客戶訪問&#xff0c;所以mysqld可能一次會接受到多個關于CURD的請求。&#xff08;2&#xff09;且mysql內部是采用多線程來完成數…

藍橋杯刷題--寶石組合

在一個神秘的森林里&#xff0c;住著一個小精靈名叫小藍。有一天&#xff0c;他偶然發現了一個隱藏在樹洞里的寶藏&#xff0c;里面裝滿了閃爍著美麗光芒的寶石。這些寶石都有著不同的顏色和形狀&#xff0c;但最引人注目的是它們各自獨特的 “閃亮度” 屬性。每顆寶石都有一個…

DAY06:【pytorch】圖像增強

1、基本概念 數據增強&#xff0c;又稱數據增廣、數據擴增&#xff0c;是對訓練集進行變換&#xff0c;使訓練集更豐富&#xff0c;從而讓模型更具泛化能力 2、裁剪 — — Crop 2.1 transforms.CenterCrop 功能&#xff1a;從圖像中心裁剪圖片 size&#xff1a;所需裁剪圖…

mysql 禁止 讀 某個 表

mysql 禁止 讀 某個 表 mysql禁用某張表,禁用MySQL表的操作 https://shuyeidc.com/wp/89479.html MySQL嚴格禁止讀取表如何避免數據泄露 https://www.kdun.cn/ask/394700.html select host,user from mysql.user; FLUSH PRIVILEGES; 1. MySQL嚴格禁止讀取表如何避免數據泄露…

機器學習 從入門到精通 day_03

1. KNN算法-分類 1.1 樣本距離判斷 明可夫斯基距離&#xff1a;歐式距離&#xff0c;明可夫斯基距離的特殊情況&#xff1b;曼哈頓距離&#xff0c;明可夫斯基距離的特殊情況。 兩個樣本的距離公式可以通過如下公式進行計算&#xff0c;又稱為歐式距離。 &#xff08;…

LeetCode 熱題 100_零錢兌換(85_322_中等_C++)(動態規劃)

LeetCode 熱題 100_零錢兌換&#xff08;85_322&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;動態規劃&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;動態規劃&#xff09;&a…

游戲盾IP可以被破解嗎

游戲盾IP&#xff08;如上海云盾SDK、騰訊云游戲盾&#xff09;是專為游戲行業設計的高防服務&#xff0c;旨在抵御DDoS攻擊、CC攻擊等威脅。其安全性取決于??技術架構、防護能力??以及??運維策略??。雖然理論上沒有絕對“無法破解”的系統&#xff0c;但游戲盾IP在合理…

SpringBoot實戰1

SpringBoot實戰1 一、開發環境&#xff0c;環境搭建-----創建項目 通過傳統的Maven工程進行創建SpringBoot項目 &#xff08;1&#xff09;導入SpringBoot項目開發所需要的依賴 一個父依賴&#xff1a;&#xff08;工件ID為&#xff1a;spring-boot-starter-parent&#xf…

【軟考-高級】【信息系統項目管理師】【論文基礎】進度管理過程輸入輸出及工具技術的使用方法

定義 項目進度管理是為了保證項目按時完成&#xff0c;對項目中所需的各個過程進行管理的過程&#xff0c;包括規劃進度、定義活動、活動優先級排序、活動持續時間、制定進度計劃和控制進度。 管理基礎 制定進度計劃的一般步驟 選擇進度計劃方法&#xff08;如關鍵路徑法&a…

【Linux】之【Get】 chroot 環境下安裝deb包時 .postinst:行 9: 201 段錯誤 (核心已轉儲)ldconfig

背景 如題&#xff0c;在postinst文件中直接執行了ldconfig命令&#xff0c; chroot 環境下出錯&#xff0c;安裝失敗 分析 chroot 環境下不能用 ldconfig 和 systemctl 但是&#xff1a;如果環境是 chroot&#xff0c;系統有可能沒完整掛載 /proc、/dev、系統路徑&#xff…

【論文精讀與實現】EDC2-RAG:基于動態聚類的文檔壓縮方法提升檢索增強生成RAG性能

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 1. 論文核心思想 這篇由清華大學團隊提出的EDC-RAG框架,針對當前…

OSPF接口的網絡類型和不規則區域

網絡類型(數據鏈路層所使用的協議所構建的二層網絡類型) 1、MA --- 多點接入網絡 BMA --- 支持廣播的多點接入網絡 NBMA --- 不支持廣播的多點接入網絡 2、P2P --- 點到點網絡 以太網 --- 以太網最主要的特點是需要基于MAC地址進行物理尋址&#xff0c;主要是因為以太網接口所連…

HTTP代理:內容分發戰場上的「隱形指揮官」

目錄 一、技術本質&#xff1a;流量博弈中的「規則改寫者」 二、戰略價值&#xff1a;內容分發的「四維升級」 三、實戰案例&#xff1a;代理技術的「降維打擊」 四、未來進化&#xff1a;代理技術的「認知升級」 五、結語&#xff1a;代理技術的「戰略覺醒」 在數字內容爆…

(2)網絡學習之堡壘機

堡壘機和防火墻的區別&#xff1a; 1.功能定位 防火墻主要負責抵御外部攻擊&#xff0c;就像一道堅固的城墻&#xff0c;防止黑客進入內部網絡。堡壘機則專注于內部管理&#xff0c;監控和記錄運維人員的操作行為&#xff0c;確保內部網絡的安全。 2.部署位置與作用范圍 防…

minio命令行客戶端mc常見用法

安裝minio命令行客戶端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安裝minio命令行客戶端 choco install minio-client -y# Linux安裝mc客戶端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 賦予可…

idea調整控制臺日志顯示長度

概述 在調試時&#xff0c;idea控制臺顯示的日志有長度顯示&#xff0c;當顯示的日志太長時&#xff0c;后生成的日志會覆蓋掉之前生成的日志內容。想要調整長度就可以按以下方式進行設置。 設置方法 Settings -> Editor -> General -> Console -> Override con…

oracle em修復之路

很早以前寫的文章&#xff0c;再草稿中存放太久了&#xff0c;今天開始整理20年來工作體會&#xff0c;以后陸續發出&#xff0c;希望給大家提供小小的幫助。 去年做的項目使用的oracle數據庫&#xff0c;最近要看一下&#xff0c;啟動機器進入系統&#xff0c;出現無法加載數…

QT中怎么隱藏或顯示最大化、最小化、關閉按鈕

文章目錄 方法一&#xff1a;通過代碼動態設置1、隱藏最大化按鈕2、隱藏最小化按鈕3、隱藏關閉按鈕方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手動控制按鈕 4、同時隱藏最大化和最小化按鈕5、同時隱藏最大化和關閉按鈕6、…

性能比拼: Redis vs Memcached

本內容是對知名性能評測博主 Anton Putra Redis vs Memcached Performance Benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準 在本視頻中&#xff0c;我們將對比 Redis 和 Memcached。我會介紹一些功能上的不同&#xff0c;但主要關注 性能。 首先&#xf…

P1331 洛谷 海戰

題目描述 思路 這個題需要讀懂題意&#xff0c;即“什么樣的形式表示兩只船相撞&#xff1f;” ----> 上下相鄰或左右相鄰 如果圖是不和法的&#xff0c;一定存在如下結構&#xff1a; # # . # 或 # # # . 或 # . # # 或 . # # #即四個格子里有三個#&#xff0c;一個"…