c++注意點(13)----設計模式(抽象工廠)

創建型模式

???????抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供一個接口,用于創建一系列相關或相互依賴的對象,而無需指定它們具體的類。

????????簡單說,它就像一個 "超級工廠",可以生產一整套配套的產品,而不是單一產品。比如說GUI,在windows平臺使用windows風格,mac使用mac風格。

為什么需要抽象工廠模式?

以電子設備工廠為例,我們可以清晰看到為什么需要抽象工廠模式:

  1. 產品族管理:每個品牌(蘋果、華為)都有一套配套產品(手機、電腦、平板),抽象工廠確保這些產品能協同工作(如生態互聯)
  2. 隔離具體實現:用戶不需要知道 "iPhone 15" 的具體細節,只需知道 "這是蘋果手機"
  3. 輕松切換品牌:從蘋果全家桶換成華為全家桶時,只需更換工廠,無需修改使用產品的代碼
  4. 符合開閉原則:新增小米工廠時,無需修改現有代碼,只需實現新的工廠和產品

示例

? ? ? ? 看代碼是最好理解的方法。可以看到,這里是多個工廠,每個工廠對應多個不同的設備的。

#include <iostream>
#include <string>// 抽象產品:手機
class Phone {
public:virtual ~Phone() = default;virtual std::string getName() const = 0;
};// 抽象產品:電腦
class Computer {
public:virtual ~Computer() = default;virtual std::string getName() const = 0;
};// 抽象產品:平板
class Tablet {
public:virtual ~Tablet() = default;virtual std::string getName() const = 0;
};// 具體產品:蘋果手機
class IPhone : public Phone {
public:std::string getName() const override {return "iPhone 15";}
};// 具體產品:蘋果電腦
class Mac : public Computer {
public:std::string getName() const override {return "MacBook Pro";}
};// 具體產品:蘋果平板
class IPad : public Tablet {
public:std::string getName() const override {return "iPad Pro";}
};// 具體產品:華為手機
class HuaweiPhone : public Phone {
public:std::string getName() const override {return "Huawei Mate 60";}
};// 具體產品:華為電腦
class HuaweiComputer : public Computer {
public:std::string getName() const override {return "Huawei MateBook X Pro";}
};// 具體產品:華為平板
class HuaweiTablet : public Tablet {
public:std::string getName() const override {return "Huawei MatePad Pro";}
};// 抽象工廠:電子設備工廠
class ElectronicFactory {
public:virtual ~ElectronicFactory() = default;virtual Phone* createPhone() const = 0;virtual Computer* createComputer() const = 0;virtual Tablet* createTablet() const = 0;
};// 具體工廠:蘋果工廠
class AppleFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new IPhone();}Computer* createComputer() const override {return new Mac();}Tablet* createTablet() const override {return new IPad();}
};// 具體工廠:華為工廠
class HuaweiFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new HuaweiPhone();}Computer* createComputer() const override {return new HuaweiComputer();}Tablet* createTablet() const override {return new HuaweiTablet();}
};// 客戶端代碼:使用電子設備
void useElectronicDevices(const ElectronicFactory& factory) {Phone* phone = factory.createPhone();Computer* computer = factory.createComputer();Tablet* tablet = factory.createTablet();std::cout << "使用的電子設備:" << std::endl;std::cout << "- 手機:" << phone->getName() << std::endl;std::cout << "- 電腦:" << computer->getName() << std::endl;std::cout << "- 平板:" << tablet->getName() << std::endl;delete phone;delete computer;delete tablet;
}int main() {// 使用蘋果設備std::cout << "=== 蘋果生態 ===" << std::endl;AppleFactory appleFactory;useElectronicDevices(appleFactory);// 切換到華為設備,無需修改useElectronicDevices函數std::cout << "\n=== 華為生態 ===" << std::endl;HuaweiFactory huaweiFactory;useElectronicDevices(huaweiFactory);return 0;
}

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

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

相關文章

【大語言模型入門】—— Transformer 如何工作:Transformer 架構的詳細探索

Transformer 如何工作&#xff1a;Transformer 架構的詳細探索Transformer 如何工作&#xff1a;Transformer 架構的詳細探索什么是 Transformer&#xff1f;什么是 Transformer 模型&#xff1f;歷史背景從 RNN 模型&#xff08;如 LSTM&#xff09;到 Transformer 模型在 NLP…

iOS安全和逆向系列教程 第20篇:Objective-C運行時機制深度解析與Hook技術

iOS安全和逆向系列教程 第20篇:Objective-C運行時機制深度解析與Hook技術 引言 在上一篇文章中,我們深入學習了ARM64匯編語言的基礎知識,掌握了從寄存器操作到指令分析的完整技能體系。現在,我們將把這些底層知識與iOS應用的高層邏輯聯系起來,深入探討Objective-C運行時…

IDEA中全局搜索快捷鍵Ctrl+Shift+F為何失靈?探尋原因與修復指南

在軟件開發中&#xff0c;高效地查找和管理代碼是提升生產力的關鍵。IntelliJ IDEA&#xff0c;作為一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;提供了豐富的搜索功能&#xff0c;幫助開發者迅速定位代碼、資源、甚至是IDE功能本身。 在 IntelliJ IDE…

【學習筆記】Lean4 定理證明 ing

文章目錄概述Lean4 定理證明初探示例&#xff1a;證明 1 1 2示例&#xff1a;證明 2 * (x y) 2 * x 2 * yLean4 定理證明基礎命題與定理命題&#xff08;Proposition&#xff09;定理&#xff08;Theorem&#xff09;量詞策略概述 Lean證明是指在Lean環境中&#xff0c;通…

墨者:SQL注入漏洞測試(HTTP頭注入)

墨者學院&#xff1a;SQL注入漏洞測試(HTTP頭注入)&#x1f680; 1. 什么是HTTP頭注入&#xff1f;&#x1f50d; HTTP頭注入是指攻擊者通過篡改HTTP請求頭部的字段&#xff08;如User-Agent、Referer、Cookie、Host等&#xff09;&#xff0c;將惡意SQL代碼插入到后端數據庫查…

linux_前臺,后臺進程

*在用戶訪問端口時&#xff0c;操作系統會形成對應的session,在其的內部進一步形成bash等進程 *一個會話只有一個前臺進程&#xff0c;可以有多個后臺進程&#xff0c;前臺與后臺進程的區別在于誰擁有鍵盤的使用權*前臺與后臺進程都可以訪問顯示器但是后臺無法訪問標準輸入獲取…

spring data mongodb 入門使用手冊

<!--pom.xml引入依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>文檔映射類Student.java import lombok.Data; import lombok.NoArgsCons…

Fastjson2常用操作大全:對象、字符串、集合、數組、Map與JSON互轉實戰

高性能&#xff1a; 核心解析器和生成器經過深度優化&#xff0c;性能遠超許多同類庫。 功能豐富&#xff1a; 支持標準JSON、JSONPath查詢、泛型處理、日期格式化、自定義序列化/反序列化等。 易用性&#xff1a; API 設計簡潔直觀&#xff0c;JSON 工具類提供了最常用的 toJS…

大模型——字節Coze重磅開源!Dify何去何從

大模型——字節Coze重磅開源!Dify何去何從 想必很多人盼了很久,就在昨晚,字節Coze終于開源了!Coze Studio 是字節跳動新一代 AI Agent 開發平臺扣子(Coze)的開源版本。 提供 AI Agent 開發所需的全部核心技術:Prompt、RAG、Plugin、Workflow,使得開發者可以聚焦創造 A…

NaVid——基于單目RGB捕獲的視頻讓VLM規劃「連續環境中VLN」的下一步:無需地圖/里程計/深度信息(含MP3D/R2R/RxR,及VLN-CE的詳解)

前言 因為我司「七月在線」準備于25年7月底復現下NaVILA&#xff0c;而在研究NaVILA的過程中&#xff0c;注意到了這個NaVid 雖然NaVid目前已經不是VLN sota了&#xff0c;但其首次展示了VLM在無需地圖、里程計或深度輸入的情況下&#xff0c;能夠實現優秀的導航性能且對后來…

【Vue2】結合chrome與element-ui的網頁端條碼打印

所有文章都是免費查看的&#xff0c;如果有無法查看的情況&#xff0c;煩請聯系我修改哈~ 序言 為什么要做這個呢&#xff1f;因為所需要的條碼打印功能比較簡單&#xff0c;符合需要即可&#xff0c;但是呢網上查看了發現并沒有合適的開源項&#xff0c;其他成熟的軟件收費又超…

循環神經網絡——動手學深度學習7

環境&#xff1a;PyCharm python3.8 &#x1f449;【循環神經網絡】(recurrent neural network&#xff0c;RNN) RNN通過 引入狀態變量存儲過去的信息和當前的輸入&#xff0c;從而可以確定當前的輸出。狀態變量捕捉序列的時序依賴&#xff0c;是處理文本、時間序列等數據的…

Java面試寶典:MySQL8新特性底層原理

一、降序索引的革新 1.1 降序索引的核心概念 MySQL 8.0 實現了真正的降序索引(Descending Index) 支持,這是數據庫引擎層面的重大改進: 存儲引擎支持:僅 InnoDB 存儲引擎支持降序索引,且僅適用于 B+Tree 索引結構 語法顯式聲明:通過 DESC 關鍵字顯式指定字段的排序方向…

前端-html+CSS基礎到高級(三)html基礎和開發工具

一、html語法規范什么是注釋?在同學上課學習時&#xff0c;我們會在書本段落間記錄內容的注解&#xff0c;方便下次看到此處理解。問題&#xff1a;我們在書本段落間記錄下的注解是為了給誰看的&#xff1f; 下次的閱讀課本者&#xff08;自己&#xff09;。程序員在寫代碼時也…

-Dspring.output.ansi.enabled=ALWAYS 設置彩色日志不生效

-Dspring.output.ansi.enabledALWAYS 設置彩色日志不生效 問題原因&#xff1a;使用的自定義的 logback-spring.xml日志需要改一下 <?xml version"1.0" encoding"UTF-8"?> <configuration><appender name"STDOUT" class"c…

C# 判斷語句深度解析

C# 判斷語句深度解析 引言 在編程領域,C# 是一種廣泛使用的面向對象的編程語言,常用于構建各種應用程序,從桌面到移動應用,再到網站服務。C# 的核心特性之一是其強大的控制流機制,其中包括條件判斷。本文將深入探討 C# 中的判斷語句,包括它們的類型、使用場景以及最佳實…

Ambari 3.0.0 全網首發支持 Ubuntu 22!

本月我們團隊帶來了一個重磅進展&#xff1a;Ambari 3.0.0 全網首發支持 Ubuntu 22&#xff01; 經過數月籌備和持續迭代&#xff0c;終于讓 Ambari 以及大數據基礎組件可以順利運行在 Ubuntu 22 上。 需求來源&#xff1a;用戶呼聲決定研發方向 年初有位小伙伴私信我們&#x…

Android Camera capture

序 想了下還是擠擠時間&#xff0c;把相機這基礎流程寫完吧&#xff0c;前面每篇寫的都還是挺耗時的&#xff08;就是累了&#xff0c;想偷偷懶&#xff0c;哈哈哈哈&#xff09;&#xff0c;那接著前面的幾篇文章&#xff0c;給這一些列寫上一個中規中矩的結局吧~ APP層 以下是…

落霞歸雁思維框架應用(十) ——在職考研 199 管綜 + 英語二 30 周「順水行舟」上岸指南

落霞歸雁思維框架應用&#xff08;十&#xff09; ——在職考研 199 管綜 英語二 30 周「順水行舟」上岸指南 CSDN 首發 | 作者&#xff1a;落霞歸雁 | 2025-08-01 開場&#xff1a;把 199英二 從“兩座大山”變成“兩條順流” 在職黨最怕兩句話&#xff1a; “管綜題量太大…

自動調優 vLLM 服務器參數(實戰指南)

1. 操作步驟 該腳本能夠自動搜索最優的vLLM服務器參數組合&#xff08;包括max-num-seqs和max-num-batched-tokens&#xff09;&#xff0c;在滿足端到端延遲和前綴緩存命中率等要求的同時&#xff0c;實現吞吐量最大化。 1.1 前提條件 克隆 vLLM 并切到目標分支git clone http…