【第二節】C++設計模式(創建型模式)-抽象工廠模式

目錄

引言

一、抽象工廠模式概述

二、抽象工廠模式的應用

三、抽象工廠模式的適用場景

四、抽象工廠模式的優缺點

五、總結


?

引言

????????抽象工廠設計模式是一種創建型設計模式,旨在解決一系列相互依賴對象的創建問題。它與工廠方法模式密切相關,但在應用場景和實現方式上有顯著區別。本文將通過理論講解和代碼示例,深入探討抽象工廠模式的核心思想、適用場景及其優缺點。

一、抽象工廠模式概述

(1) 核心思想

????????抽象工廠模式通過定義一個創建一系列相關或相互依賴對象的接口,將具體對象的創建工作封裝到具體的工廠類中。它強調面向接口編程,支持多種變化需求,同時確保生成的對象的關聯性和兼容性。

(2)與工廠方法模式的關系

工廠方法模式:解決單一對象的創建問題,通過子類化實現對象的創建。
抽象工廠模式:解決一系列相互依賴對象的創建問題,通過一個工廠類創建多個相關對象。

(3)主要解決的問題

????????避免直接使用 `new` 操作符導致的對象綁定問題。
????????支持多種變化需求(如多種數據庫、多種產品系列)。
????????確保生成的對象的關聯性和兼容性。

(4)數據庫訪問層示例

需求分析
????????在數據庫訪問層中,通常需要創建以下對象:
????????數據庫連接(`IDbConnection`)
????????命令對象(`IDbCommand`)
????????數據讀取器對象(`IDataReader`)

????????不同數據庫(如 MySQL、SQL Server)需要不同的實現類。如果直接使用 `new` 關鍵字創建對象,會導致代碼與具體數據庫綁定,難以支持多種數據庫。

面向接口編程
????????通過定義接口 `IDbConnection`、`IDbCommand` 和 `IDataReader`,實現面向接口編程。具體數據庫的連接、命令和讀取器類繼承自這些接口,從而支持多種數據庫的實現。

工廠方法模式的局限性
????????工廠方法模式可以解決單一對象的創建問題,但不適用于創建多個相互依賴的對象。例如,不同工廠可能創建不兼容的對象組合,導致錯誤。

二、抽象工廠模式的應用

(1)解決對象組合問題

????????抽象工廠模式將多個相互依賴對象的創建工作合并到一個工廠類中。通過一個工廠類創建所有相關對象,確保對象之間的兼容性。

(2)代碼示例

????????以下是一個簡單的抽象工廠模式實現示例,展示了如何創建一組相關對象。

????????Abstract Factory模式的核心價值在于通過抽象工廠接口將一組相關或依賴對象的創建過程統一封裝到具體工廠類(ConcreteFactory)中。這種集中化的對象創建機制不僅符合單一職責原則,更重要的是通過消除分散的創建邏輯,顯著降低了系統在對象實例化層面的維護復雜度,為產品族的擴展提供了規范的框架基礎。?


產品類定義

// Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_class AbstractProductA {
public:virtual ~AbstractProductA();
protected:AbstractProductA();
};class AbstractProductB {
public:virtual ~AbstractProductB();
protected:AbstractProductB();
};class ProductA1 : public AbstractProductA {
public:ProductA1();~ProductA1();
};class ProductA2 : public AbstractProductA {
public:ProductA2();~ProductA2();
};class ProductB1 : public AbstractProductB {
public:ProductB1();~ProductB1();
};class ProductB2 : public AbstractProductB {
public:ProductB2();~ProductB2();
};#endif // ~_PRODUCT_H_

工廠類定義

// AbstractFactory.h
#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_class AbstractProductA;
class AbstractProductB;class AbstractFactory {
public:virtual ~AbstractFactory();virtual AbstractProductA* CreateProductA() = 0;virtual AbstractProductB* CreateProductB() = 0;
protected:AbstractFactory();
};class ConcreteFactory1 : public AbstractFactory {
public:ConcreteFactory1();~ConcreteFactory1();AbstractProductA* CreateProductA();AbstractProductB* CreateProductB();
};class ConcreteFactory2 : public AbstractFactory {
public:ConcreteFactory2();~ConcreteFactory2();AbstractProductA* CreateProductA();AbstractProductB* CreateProductB();
};#endif // ~_ABSTRACTFACTORY_H_

工廠類實現

// AbstractFactory.cpp
#include "AbstractFactory.h"
#include "Product.h"
#include <iostream>
using namespace std;AbstractFactory::AbstractFactory() {}
AbstractFactory::~AbstractFactory() {}ConcreteFactory1::ConcreteFactory1() {}
ConcreteFactory1::~ConcreteFactory1() {}
AbstractProductA* ConcreteFactory1::CreateProductA() {return new ProductA1();
}
AbstractProductB* ConcreteFactory1::CreateProductB() {return new ProductB1();
}ConcreteFactory2::ConcreteFactory2() {}
ConcreteFactory2::~ConcreteFactory2() {}
AbstractProductA* ConcreteFactory2::CreateProductA() {return new ProductA2();
}
AbstractProductB* ConcreteFactory2::CreateProductB() {return new ProductB2();
}

測試程序

// main.cpp
#include "AbstractFactory.h"
#include <iostream>
using namespace std;int main(int argc, char* argv[]) {AbstractFactory* cf1 = new ConcreteFactory1();cf1->CreateProductA();cf1->CreateProductB();AbstractFactory* cf2 = new ConcreteFactory2();cf2->CreateProductA();cf2->CreateProductB();return 0;
}

????????從實現層面來看,Abstract Factory模式通過具體工廠類(ConcreteFactory1)對產品對象的創建過程進行封裝。在測試用例中可見,當需要構建一組相關聯的產品對象(如ProductA1、ProductA2)時,客戶端僅需依賴統一的工廠接口進行操作,而無需關注具體產品的實例化細節。這種設計不僅降低了代碼的耦合度,更重要的是將原本分散在各處的對象創建邏輯集中管理,顯著提升了系統的可維護性和擴展性。

????????在理解設計模式的過程中,區分Abstract Factory模式與Factory模式的概念差異是一個關鍵的學習點。本質上,Abstract Factory模式旨在為一系列具有關聯性或依賴關系的對象族提供統一的創建接口,它關注的是產品家族的創建邏輯;而Factory模式則專注于單一類型對象的實例化過程,通過將對象的創建延遲到子類來實現擴展性,其核心是單一產品的創建機制。從實現角度來看,Abstract Factory模式通常以Factory模式為基礎,通過具體工廠類(ConcreteFactory1)來實現對多個關聯產品的協同創建,這種層次化的設計體現了模式間的組合應用。

三、抽象工廠模式的適用場景

(1)一系列相互依賴對象的創建
????????抽象工廠模式適用于需要創建一組相關對象的場景,例如:
????????????????數據庫訪問層中的連接、命令和讀取器對象。
????????????????游戲開發中的不同等級怪物及其相關對象。

(2)支持多系列對象的需求變化
????????當需求變化時,抽象工廠模式可以輕松支持更多系列對象的創建工作,而無需修改現有代碼。

四、抽象工廠模式的優缺點

優點
????????高內聚性:將相關對象的創建集中在一個工廠類中,提高代碼的內聚性。
????????易于擴展:支持新增系列對象的創建,符合開閉原則。
????????降低耦合:通過面向接口編程,降低客戶端與具體實現類的耦合。

缺點
????????難以應對新對象的需求變動:如果需要新增對象類型,可能需要修改抽象工廠接口及其所有實現類。
????????復雜性增加:隨著系列對象的增多,工廠類的數量也會增加,導致系統復雜性上升。

五、總結

????????抽象工廠模式是一種強大的設計模式,適用于解決一系列相互依賴對象的創建問題。它通過面向接口編程和封裝對象創建邏輯,提高了代碼的靈活性和可維護性。然而,在面對新對象需求變動時,抽象工廠模式可能顯得不夠靈活。因此,在實際開發中,應根據具體需求選擇合適的設計模式。

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

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

相關文章

ubuntu20.04重啟后不顯示共享文件夾

ubuntu20.04重啟后不顯示共享文件夾 主要參見這兩篇博客 Ubuntu重啟后不顯示共享文件夾_ubuntu 20.04 共享目錄無法使用-CSDN博客 ubuntu22.04 配置共享文件夾 找不到/mnt/hgfs_ubuntu安裝tools 后mnt文件夾在哪-CSDN博客 重啟Ubuntu20.04后&#xff0c;發現共享文件夾進不去…

halcon機器視覺深度學習對象檢測,物體檢測

目錄 效果圖操作步驟軟件版本halcon參考代碼本地函數 get_distinct_colors()本地函數 make_neighboring_colors_distinguishable() 效果圖 操作步驟 首先要在Deep Learning Tool工具里面把圖片打上標注文本&#xff0c; 然后訓練模型&#xff0c;導出模型文件 這個是模型 mod…

9.PG數據庫層權限管理(pg系列課程)第2遍

一、PostgreSQL數據庫屬主 Postgres中的數據庫屬主屬于創建者&#xff0c;只要有createdb的權限就可以創建數據庫&#xff0c;數據庫屬主不一定擁有存放在該數據庫中其它用戶創建的對象的訪問權限。數據庫在創建后&#xff0c;允許public角色連接&#xff0c;即允許任何人連接…

2.19學習(php文件后綴)

misc buu-后門查殺 下載附件&#xff0c;我們用火絨安全掃一下然后點擊詳情進入該文件所在文件夾&#xff0c;再用記事本打開該文件&#xff0c;搜索flag無果&#xff0c;再試試pass&#xff08;由題目中的密碼聯系到pass&#xff0c;password&#xff0c;key等&#xff09;&a…

PMBOK第7版整體架構全面詳解

1. 引言 7月1日對于項目管理從業者和研究者而言&#xff0c;是個非凡意義的一個時間&#xff0c;這一天&#xff0c;翹首以待的《 項 目管理知識體系指南 》&#xff08;PMBOK&#xff09;第七版終于發布了。 總體而言&#xff0c;PMBOK第七版集百家之所長&#xff0c;成一…

C++:類與對象,定義類和構造函數

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何讓定義一個類 // 封裝 // 1、將數據和方法定義到一起。 // 2、把想給你看的數據給你看&#xff0c;不想給你看的封裝起來。 通過訪問限定符來實現 class Stack { public: //1.成…

nginx 部署前端vue項目

?? 主頁&#xff1a; ?? 感謝各位大佬 點贊?? 收藏 留言?? 加關注! ?? 收錄于專欄&#xff1a;前端工程師 文章目錄 一、??什么是nginx&#xff1f;二、??nginx 部署前端vue項目步驟 2.1 ??安裝nginx 2.1.1 ??windows環境安裝2.1.2 ??linux環境安裝 2.2 …

藍橋杯備考策略

備賽策略 (1-2周):基礎算法數據結構 (3-5周):動態規劃/貪心圖論 (6-8周):全真模擬查漏補缺 階段1:基礎鞏固(第1-2周) **目標:**掌握基礎數據結構和必考算法&#xff0c;熟悉藍橋杯題型。 學習內容: 數據結構:數組、字符串、棧、隊列、哈希表、二叉樹(遍歷與基本操作)。 基礎…

tmux和vim的基本操作

Tmux Tmux 的核心功能 多窗口和多面板&#xff1a; 在一個終端中創建多個窗口&#xff08;Windows&#xff09;&#xff0c;每個窗口可以運行不同的任務。 在每個窗口中&#xff0c;可以進一步分割成多個面板&#xff08;Panes&#xff09;&#xff0c;實現分屏操作。 會話…

Lineageos 22.1(Android 15) 開機向導制作

一、前言 開機向導原理其實就是將特定的category的Activity加入ComponentResolver&#xff0c;如下 <category android:name"android.intent.category.SETUP_WIZARD"/>然后我們開機啟動的時候&#xff0c;FallbackHome結束&#xff0c;然后啟動Launcher的時候…

【二分搜索 C/C++】洛谷 P1873 EKO / 砍樹

2025 - 02 - 19 - 第 55 篇 Author: 鄭龍浩 / 仟濹(CSND) 【二分搜索】 文章目錄 洛谷 P1873 EKO / 砍樹題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1 輸入輸出樣例 #2輸入 #2輸出 #2 說明/提示題目中的部分變量思路代碼 洛谷 P1873 EKO / 砍樹 題目描述 伐木工人…

DeepSeek系列模型發展:從LLM到V3、R1的技術突破與優化各階段的重要論文匯總(附下載地址)

DeepSeek 系列模型從最初的 LLM 版本發展到最新的 V3 和 R1 版本&#xff0c;在架構設計、訓練效率和推理能力方面不斷取得進步。以下是各版本按時間倒序的詳細信息&#xff1a; 1. DeepSeek-R1 發布時間&#xff1a;2025年1月 論文標題&#xff1a;DeepSeek-R1: Incentivizi…

HTTP SSE 實現

參考&#xff1a; SSE協議 SSE技術詳解&#xff1a;使用 HTTP 做服務端數據推送應用的技術 一句概擴 SSE可理解為&#xff1a;服務端和客戶端建立連接之后雙方均保持連接&#xff0c;但僅支持服務端向客戶端推送數據。推送完畢之后關閉連接&#xff0c;無狀態行。 下面是基于…

推薦一款AI大模型托管平臺-OpenWebUI

推薦一款AI大模型托管平臺-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官網地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一個可擴展、功能豐富且用戶友好的自托管 AI 平臺&#xff0c;旨在完全離…

js中常用方法整理

數據類型 typeOf()Number&#xff08;&#xff09;parseInt()parseFloat()- * / %檢測數據類型轉換為數字轉換為整數類型轉換為浮點類型非加法的數字運算toString()Boolean()String()轉換為字符串&#xff0c;不能轉換undefined/null字符串拼接轉換為布爾類型轉換為字符串、所有…

java練習(33)

ps:題目來自力扣 最強回文子串 給你一個字符串 s&#xff0c;找到 s 中最長的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…

本地部署DeepSeek大模型

環境&#xff1a;nuc工控機器 x86架構 ubuntu20.04 1、瀏覽器打開Download Ollama on Linux&#xff0c;復制命令。 2.打開終端&#xff0c;輸入命令。 curl -fsSL https://ollama.com/install.sh | sh 等待安裝&#xff0c;安裝完成后&#xff0c;終端輸入 ollama&#xff…

Nginx 常用命令和部署詳解及案例示范

一、Nginx常用命令 1.1 啟動 Nginx 要啟動 Nginx 服務&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服務&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重啟 Nginx 在修改了 Nginx…

2025鴻蒙開發面試題匯總——通俗易懂

問題和通俗易懂的答案&#xff0c;覆蓋鴻蒙開發的核心知識點和實際場景&#xff0c;方便面試時快速評估候選人能力&#xff1a; 一、基礎概念&#xff08;必問&#xff09; 鴻蒙和安卓最大的區別是什么&#xff1f;舉個實際例子。 答案&#xff1a;鴻蒙是“分布式操作系統”&am…

Kotlin 優雅的接口實現

1. 日常遇到的冗余的接口方法實現 日常開發中&#xff0c;經常會要實現接口&#xff0c;但是很多場景中&#xff0c;只需要用到其中一兩個方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多個接口需要實現&#xff0c;但是很多時候我們只需要用到其中的一…