【c++設計模式05】創建型3:抽象工廠模式(Abstact Factory Pattern)

【c++設計模式05】創建型3:抽象工廠模式(Abstact Factory Pattern)

  • 一、工廠模式
  • 二、抽象工廠模式
  • 三、UML類圖
  • 四、demo
  • 五、總結

原創作者:鄭同學的筆記
原創地址:https://zhengjunxue.blog.csdn.net/article/details/132306496
qq技術交流群:921273910

類型序號設計模式描述
創建型1簡單工廠模式
(Simple Factory Pattern)
通過一個工廠類負責創建所有產品的實例
2工廠方法模式
(Factory Pattern)
將對象的實例化延遲到子類中實現
3抽象工廠模式
(Abstact Factory Pattern)
通過提供一組相關產品的接口,實現了一系列具體工廠類來創建不同產品族的實例
4單例模式
(Singleton Pattern)
保證一個類只有一個實例
5創建者模式
(Builder Pattern)
如何創建一個組合對象
6原型模式
(Prototype Pattern)
它通過復制已有對象來創建新的實例

一、工廠模式

  • 工廠模式是一種軟件設計模式,它提供了一種創建對象的方式,將對象的實例化和使用分離開來。工廠模式通過定義一個公共的接口或抽象類來創建對象,并由實現該接口或繼承該抽象類的具體工廠類負責實例化對象。

  • 在工廠模式中,客戶端通過調用工廠類的方法來獲取所需的對象,而無需直接實例化對象。工廠類根據不同的需求條件,使用不同的邏輯或算法創建相應的對象,隱藏了對象創建的具體細節。

  • 工廠模式可以有效地降低系統的耦合度,提高代碼的可維護性和可擴展性。它符合面向對象設計原則中的開放封閉原則,即對擴展開放,對修改封閉。當需要新增一種產品時,只需添加相應的具體產品類和對應的工廠類,而無需修改已有的代碼。

  • 常見的工廠模式包括簡單工廠模式工廠方法模式抽象工廠模式
    簡單工廠模式通過一個工廠類負責創建所有產品的實例;
    工廠方法模式將對象的實例化延遲到子類中實現;
    抽象工廠模式通過提供一組相關產品的接口,實現了一系列具體工廠類來創建不同產品族的實例。

二、抽象工廠模式

工廠模式里面,只有蘋果、香蕉,實際情況可能更加的復雜,比如蘋果也有不同的國家生成的,比如

水果\國家中國美國
蘋果中國蘋果美國蘋果
香蕉中國香蕉美國香蕉

在抽象工廠模式中,除了有產品的抽象類(Apple和Banana),還有一個抽象的工廠類(Factory)。工廠類定義了一個或多個用于創建不同類別產品的純虛函數,其中每個純虛函數對應一個具體的產品。在這段代碼中,Factory類中的createApple()和createBanana()函數就是抽象工廠方法。

然后通過具體的工廠類(ChinaFactory和USAFactory)繼承抽象工廠類,并實現了抽象工廠類中的純虛函數,這些具體的工廠類分別負責創建中國水果和美國水果的對象。

抽象工廠模式的優點是可以確保客戶端只能訪問抽象接口,而不用擔心具體的產品類。它提供了一種靈活的方式來創建相關的產品族,且易于替換不同的具體工廠類。缺點是當需要添加新的產品類時,需要修改抽象工廠和所有的具體工廠類,違反了開閉原則。

總結來說,抽象工廠模式是一種創建一族相關對象的設計模式,通過定義抽象的工廠類和產品類,以及具體的工廠類的組合,實現了對象的創建與客戶端的解耦。這種模式在需要創建一系列相關對象時非常有用,可以根據不同的具體工廠類來創建不同產品族的對象。

三、UML類圖

  • 當然,蘋果和香蕉也可以同時繼承一個水果類,但是我們這里用不到,就不畫了。
  • 抽象工廠模式AbstractFactory 模式就是用來解決這類問題的:要創建一組相關或者相互依賴的對象。
    在這里插入圖片描述

四、demo

#include<iostream>
using namespace std;class Apple {
public:virtual void say() {};virtual ~Apple() {};
};
class Banana {
public:virtual void say() {};virtual ~Banana() {};
};
class ChinaApple : public Apple {
public:void say() override{cout << "i am a China Apple\n";}
};
class ChinaBanana : public Banana {
public:void say(){cout << "i am a china Banana\n";}
};class USAApple : public Apple {
public:void say() override{cout << "i am a USA Apple\n";}
};
class USABanana : public Banana {
public:void say(){cout << "i am a USA Banana\n";}
};class Factory {
public:virtual Apple* createApple() = 0;virtual Banana* createBanana() = 0;virtual ~Factory() {};
};class USAFactory:public Factory {
public:Apple* createApple() override{return new USAApple;}Banana* createBanana() override {return new USABanana;}
};class ChinaFactory :public Factory {
public:Apple* createApple() override {return new ChinaApple;}Banana* createBanana() override {return new ChinaBanana;}
};int main()
{Factory* factory = new ChinaFactory();Apple* obj = factory->createApple();obj->say();factory = new USAFactory();Banana* obj2 = factory->createBanana();obj2->say();return 0;
}

輸出

在這里插入圖片描述

五、總結

AbstractFactory 模式和 Factory模式的區別是初學(使用)設計模式時候的一個容易引起困惑的地方。實際上,AbstractFactory模式是為創建一組(有多類)相關或依賴的對象提供創建接口,而 Factory模式是為一類對象提供創建接口或延遲對象的創建到子類中實現。并且可以看到,AbstractFactory模式通常都是使用 Factory 模式實現。

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

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

相關文章

Spring 源碼解析

文章目錄 前言相關Spring的定義接口整體代碼StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh")prepareRefresh()obtainFreshBeanFactory()registerBeanPostProcessors(beanFactory)SpringAOP原碼流程EnableAspectJAutoProxyAnno…

Linux調試器-gdb使用與馮諾依曼體系結構

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言 Linux調試器-gdb使用 1. 背景 2. 開始使用 馮諾依曼體系結構 總結 前言 世上有兩種耀眼的光芒&#xff0c;一種是正在升起的太陽&#xff0c;一種是正在努力學…

計算機網絡-網絡互連和互聯網(五)

1.路由器技術NAT&#xff1a; 網絡地址翻譯&#xff0c;解決IP短缺&#xff0c;路由器內部和外部地址進行轉換。靜態地址轉換&#xff1a;靜態NAT&#xff08;一對一&#xff09; 靜態NAT&#xff0c;內外一對一轉換&#xff0c;用于web服務器&#xff0c;ftp服務器等固定IP的…

(定時器/計數器)中斷系統(詳解與使用)

講解 簡介 定時器/計數器 定時器實際上也是計數器,只是計數的是固定周期的脈沖 定時和計數只是觸發來源不同(時鐘信號和外部脈沖)其他方面是一樣的。 定時器在單片機內部就像一個小鬧鐘一樣,根據時鐘的輸出信號,每隔“一秒”,計數單元的數值就增加一,當計數單元數值…

C++:String類的使用

創作不易&#xff0c;感謝三連&#xff01;&#xff01; 在C語言中&#xff0c;我們想要存儲字符串的話必須要用字符數組 char str[]"hello world"這其實是將在常量區的常量字符串拷貝到數組中&#xff0c;我們會在數組的結尾多開一個空間存儲\0&#xff0c;這樣我…

前端構建之CERT_HAS_EXPIRED和certificate has expired解決方案

問題 2024年 1 月 22 日&#xff0c;淘寶原鏡像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 證書正式到期。如果想要繼續使用&#xff0c;需要將 npm 源切換到新的源&#xff08;registry.npmmirror.com&#xff09;&#xff0c;否則會報錯。 報錯信息為&a…

Consul服務注冊與發現 Consul配置步驟

Consul服務注冊與發現 Consul配置步驟 consul下載地址 Install | Consul | HashiCorp Developer 啟動需要在 下載好的文件夾里 用cmd 運行consul agent -dev啟動consul Consul配置 配置pom <!--SpringCloud consul config--> <dependency><groupId>org…

【leetcode】回文子串 動態規劃

/*** param {string} s* return {number}*/ var countSubstrings function(s) {let dpnew Array(s.length).fill().map(()>new Array(s.length).fill(false));let num0;for(let i0;i<s.length;i){for(let j0;j<i;j){//在首尾相等時&#xff0c;如果長度時1或者2&…

C++筆記(三)--- 函數重載

目錄 子類繼承父類重載 類成員函數重載 繼承和組合的三種方式請看我上一篇文章 C筆記&#xff08;二&#xff09;--- 繼承和組合-CSDN博客 子類繼承父類重載 當子類繼承父類之后&#xff0c;子類重新定義了一個和父類完全相同函數名稱的函數時&#xff0c;會將父類所有相同…

Pegasus智能家居套件樣例開發--軟定時器

樣例簡介 此樣例將演示如何在Pegasus Wi-Fi IoT智能家居套件上使用cmsis 2.0 接口進行定時器開發。 工程版本 系統版本/API版本&#xff1a;OpenHarmony 3.0 releaseIDE版本&#xff1a;DevEco Device Tool Release 3.0.0.401 快速上手 準備硬件環境 預裝windows系統的PC…

『大模型筆記』RAG應用的12種調優策略指南

RAG應用的12種調優策略指南 文章目錄 一. 概要二. 數據索引2.1. 數據清洗2.2. 分塊2.3. 嵌入模型2.4. 元數據(或未向量化的數據)2.5. 多索引2.6. 索引算法三. 推理階段(檢索和生成)3.1. 檢索參數3.2. 高級檢索策略3.3. 重新排序模型3.5. 大語言模型(LLM)

26、Qt調用.py文件中的函數

一、開發環境 Qt5.12.0 Python3.7.8 64bit 二、使用 新建一個Qt項目&#xff0c;右擊項目名稱&#xff0c;選擇“添加庫” 選擇“外部庫”&#xff0c;點擊“下一步” 點擊“瀏覽”&#xff0c;選擇Python安裝目錄下的libs文件夾中的“python37.lib”文件&#xff0c;點擊“下…

退休開便利店真的靠譜嗎?2024比較賺錢的創業項目排行

近日多個退休后開便利店賺錢的新聞登上熱搜&#xff0c;但是&#xff0c;小編對此有疑問&#xff0c;退休的老年人開便利店真的是一個好選擇嗎&#xff1f; 第一、便利店最基本的轉讓費&#xff0c;裝修費&#xff0c;進貨等等&#xff0c;這筆開支非常大&#xff0c;足以掏空老…

H5下拉刷新分頁

對于分頁需求&#xff0c;分頁數據的請求觸發十分重要&#xff0c;監聽滑動到底的觸發也有很多種。 1.IntersectionObserver監聽 IntersectionObserver 接口&#xff08;從屬于 Intersection Observer API&#xff09;提供了一種異步觀察目標元素與其祖先元素或頂級文檔視口&a…

終結數據混亂!開發者必學的GraphQL秘籍,高效API只需一步

在數字世界中&#xff0c;API就如同城市中的道路&#xff0c;連接著各種服務和數據。然而&#xff0c;傳統的API&#xff08;如RESTful&#xff09;雖然功不可沒&#xff0c;但隨著技術復雜性和需求多樣性不斷攀升&#xff0c;它們顯露出的局限性也呼喚著新的可能出現。此時&am…

Unity中,activeInHierarchy 和 activeSelf

activeInHierarchy&#xff1a; activeInHierarchy 屬性表示游戲對象是否在場景中處于激活狀態&#xff0c;并且是否在層次結構中的激活狀態。它考慮了游戲對象以及其所有父對象的激活狀態。如果 activeInHierarchy 為 true&#xff0c;表示該對象在場景中處于激活狀態且其所有…

LaMa Image Inpainting 圖像修復 Onnx Demo

目錄 介紹 效果 模型信息 項目 代碼 下載 LaMa Image Inpainting 圖像修復 Onnx Demo 介紹 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

《PyTorch深度學習實踐》第十三講RNN進階

一、 雙向循環神經網絡&#xff08;Bidirectional Recurrent Neural Network&#xff0c;BiRNN&#xff09;是一種常見的循環神經網絡結構。與傳統的循環神經網絡只考慮歷史時刻的信息不同&#xff0c;雙向循環神經網絡不僅考慮歷史時刻的信息&#xff0c;還考慮未來時刻的信息…

wireshark過濾和tcpdump抓包指令

Wireshark 過濾器的表達式&#xff0c;用于過濾源 IP 地址為 10.184.148.247 并且目標 TCP 端口為 1883 的數據包。啟用抓包后過濾 ip.addr 10.184.148.247 && tcp.port 1883 主機位10.184.148.19和目標端口為 8080 的操作目標 抓包前過濾 host 10.184.148.19 &…

軟件說明書怎么寫?終于有人一次性說清楚了!

每次寫軟件說明書&#xff0c;你是不是總是毫無頭緒&#xff0c;不知道從何下手&#xff1f;到各網站找資料&#xff0c;不僅格式不規范&#xff0c;甚至可能遺漏關鍵內容&#xff01;挨一頓批不說&#xff0c;還浪費大把時間。別著急&#xff0c;編寫軟件說明書&#xff0c;關…