工廠模式總結

工廠模式


1. 簡單工廠模式(Simple Factory)

核心思想
  • 定義一個工廠類,根據輸入參數創建不同的具體對象。
  • 客戶端不直接調用具體類的構造函數,而是通過工廠類獲取對象。
示例代碼
#include <iostream>
#include <memory>// 抽象產品類
class Shape {
public:virtual void draw() = 0;virtual ~Shape() = default;
};// 具體產品類:圓形
class Circle : public Shape {
public:void draw() override {std::cout << "Drawing a Circle" << std::endl;}
};// 具體產品類:矩形
class Rectangle : public Shape {
public:void draw() override {std::cout << "Drawing a Rectangle" << std::endl;}
};// 簡單工廠類
class ShapeFactory {
public:enum class Type { Circle, Rectangle };// 創建對象的方法static std::unique_ptr<Shape> createShape(Type type) {switch (type) {case Type::Circle:return std::make_unique<Circle>();case Type::Rectangle:return std::make_unique<Rectangle>();default:throw std::invalid_argument("Invalid shape type");}}
};// 客戶端使用
int main() {auto circle = ShapeFactory::createShape(ShapeFactory::Type::Circle);circle->draw();  // Output: Drawing a Circleauto rect = ShapeFactory::createShape(ShapeFactory::Type::Rectangle);rect->draw();    // Output: Drawing a Rectanglereturn 0;
}
特點
  • 優點:代碼簡單,集中管理對象的創建邏輯。
  • 缺點:違反開閉原則(新增類型需修改工廠類)。

2. 工廠方法模式(Factory Method)

核心思想
  • 定義一個創建對象的抽象接口,由子類決定具體實例化的類。
  • 每個具體產品對應一個具體工廠類。
示例代碼
#include <iostream>
#include <memory>// 抽象產品類
class Button {
public:virtual void render() = 0;virtual ~Button() = default;
};// 具體產品類:Windows 按鈕
class WindowsButton : public Button {
public:void render() override {std::cout << "Rendering a Windows-style button" << std::endl;}
};// 具體產品類:MacOS 按鈕
class MacOSButton : public Button {
public:void render() override {std::cout << "Rendering a MacOS-style button" << std::endl;}
};// 抽象工廠類
class ButtonFactory {
public:virtual std::unique_ptr<Button> createButton() = 0;virtual ~ButtonFactory() = default;
};// 具體工廠類:Windows 按鈕工廠
class WindowsButtonFactory : public ButtonFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<WindowsButton>();}
};// 具體工廠類:MacOS 按鈕工廠
class MacOSButtonFactory : public ButtonFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<MacOSButton>();}
};// 客戶端使用
void renderUI(ButtonFactory& factory) {auto button = factory.createButton();button->render();
}int main() {WindowsButtonFactory winFactory;renderUI(winFactory);  // Output: Rendering a Windows-style buttonMacOSButtonFactory macFactory;renderUI(macFactory);  // Output: Rendering a MacOS-style buttonreturn 0;
}
特點
  • 優點:符合開閉原則,擴展新類型只需添加新工廠類。
  • 缺點:類數量增加,系統復雜度提升。

3. 抽象工廠模式(Abstract Factory)

核心思想
  • 提供一個接口,用于創建一組相關或依賴的對象家族
  • 適合需要創建多個協同工作的對象的場景(如 GUI 組件庫)。
示例代碼
#include <iostream>
#include <memory>// 抽象產品類:按鈕
class Button {
public:virtual void render() = 0;virtual ~Button() = default;
};// 抽象產品類:文本框
class TextBox {
public:virtual void input() = 0;virtual ~TextBox() = default;
};// Windows 系列產品
class WindowsButton : public Button {
public:void render() override {std::cout << "Windows Button" << std::endl;}
};class WindowsTextBox : public TextBox {
public:void input() override {std::cout << "Windows TextBox" << std::endl;}
};// MacOS 系列產品
class MacOSButton : public Button {
public:void render() override {std::cout << "MacOS Button" << std::endl;}
};class MacOSTextBox : public TextBox {
public:void input() override {std::cout << "MacOS TextBox" << std::endl;}
};// 抽象工廠接口
class GUIFactory {
public:virtual std::unique_ptr<Button> createButton() = 0;virtual std::unique_ptr<TextBox> createTextBox() = 0;virtual ~GUIFactory() = default;
};// 具體工廠:Windows 工廠
class WindowsFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<WindowsButton>();}std::unique_ptr<TextBox> createTextBox() override {return std::make_unique<WindowsTextBox>();}
};// 具體工廠:MacOS 工廠
class MacOSFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<MacOSButton>();}std::unique_ptr<TextBox> createTextBox() override {return std::make_unique<MacOSTextBox>();}
};// 客戶端使用
void createUI(GUIFactory& factory) {auto button = factory.createButton();auto textBox = factory.createTextBox();button->render();textBox->input();
}int main() {WindowsFactory winFactory;createUI(winFactory);  // Output: // Windows Button// Windows TextBoxMacOSFactory macFactory;createUI(macFactory);  // Output:// MacOS Button// MacOS TextBoxreturn 0;
}
特點
  • 優點:保證產品家族的兼容性(如統一風格)。
  • 缺點:擴展新產品家族需要修改所有工廠接口。

工廠模式的核心對比

模式適用場景擴展性復雜度
簡單工廠對象類型少且固定違反開閉原則
工廠方法單一產品,需靈活擴展具體類型新增產品類型只需添加新工廠
抽象工廠需要創建一組相關的對象(產品家族)新增產品家族需修改接口

工廠模式的典型應用場景

  1. 跨平臺 UI 開發:為不同操作系統創建風格一致的組件。
  2. 游戲開發:動態生成不同類別的敵人或道具。
  3. 數據庫訪問:根據配置創建 MySQL/Oracle 連接對象。
  4. 插件系統:加載第三方模塊時動態創建對象。

最佳實踐

  1. 優先使用工廠方法模式
    在需要靈活擴展時,避免簡單工廠的硬編碼邏輯。

  2. 結合智能指針管理對象
    使用 std::unique_ptrstd::shared_ptr 自動釋放資源。

    std::unique_ptr<Button> button = factory.createButton();
    
  3. 避免過度設計
    如果對象創建邏輯簡單,直接使用構造函數可能更高效。


總結

工廠模式通過封裝對象的創建過程,實現以下目標:

  • 解耦:客戶端代碼與具體類解耦。
  • 可維護性:集中管理創建邏輯,便于修改和擴展。
  • 靈活性:支持動態切換產品類型或家族。

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

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

相關文章

MySQL的三種安裝方式(mis、zip、yum)

目錄 2.0數據庫安裝 2.1windows上.mis格式 環境準備 MySQL的安裝 環境配置&#xff08;非必要&#xff09; 2.2windows上.zip格式安裝 環境準備 配置文件的內容 MySQL的安裝 附錄可能出現問題 圖形工具遠程連接數據庫 2.3Linux上安裝yum包 環境準備 過程命令 My…

串口學習和藍牙通信HC05(第八天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4b…

設計總監的“輕量化”新武器:用Adobe Express,音頻一鍵驅動動畫

在快節奏的創意項目中&#xff0c;如何將復雜的設計理念或冗長的研究報告&#xff0c;快速轉化為易于理解、富有吸引力的動態內容&#xff0c;是衡量一個團隊溝通效率的關鍵。作為一名在海外設計界工作了十余年的設計師&#xff0c;我發現&#xff0c;最高效的團隊&#xff0c;…

零知開源——STM32F407VET6驅動SHT41溫濕度傳感器完整教程

?零知開源是一個真正屬于國人自己的開源軟硬件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&…

Linux流量分析:tcpdump wireshark

前言 最近因為工作需要&#xff0c;研究了下如何使用tcpdump和wireshark分析業務流量。如果要使用tcpdump分析具體的HTTP請求耗時&#xff0c;需捕獲網絡數據包并分析時間戳信息&#xff0c;重點關注TCP連接的建立、HTTP請求發送到響應接收的全過程。 以下是具體步驟和技巧&…

深度學習圖像分類數據集—角膜潰瘍識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;角膜潰瘍識別分類&#xff1a;[dot, mix, slice] 訓練數據集總共有270張…

功能強、超好用【PDF轉換工具】的介紹下載與安裝教程

Windows 電腦上一款簡單好用的PDF轉換工具&#xff0c;可以輕松地將其他文檔轉換為 PDF 格式&#xff0c;也可以將 PDF 文件轉換為其他格式&#xff0c;如常見的 Word、Excel、PPT 等。 此外軟件還支持 Office 文檔合并分割、旋轉頁面、拼接頁面、刪除文字、刪除頁面、添加水印…

c# 釘釘應用實現監聽審批事件以及獲取審批結果的流程

oa的操作已經測試了一遍 image.png如果是自建oa則代表發起的審批是跳轉網頁&#xff0c;否則釘釘打開后是一個表單界面&#xff0c;不需要調整自己搞得oa。 所以我感覺目前公司的需求更適合官方oa 表單來填寫,更靈活&#xff0c;還支持用戶配置。 但是用戶點了審批&#xff0c;…

Typecho架構深度剖析:輕量級博客系統的設計哲學與實現原理

文章目錄 深度解析Typecho:輕量級博客系統的架構設計與實現1. Typecho概述與技術背景1.1 發展歷程1.2 核心特性2. 系統架構設計分析2.1 核心架構圖2.2 核心組件3. 核心模塊實現分析3.1 路由系統實現3.2 數據庫抽象層4. 插件系統深度解析4.1 Hook機制實現4.2 插件開發示例5. 性…

LangChain 內存(Memory)

1. 為什么需要內存&#xff1f; 大型語言模型&#xff08;LLM&#xff09;本身是無狀態的。這意味著每次你向 LLM 發送一個請求&#xff08;Prompt&#xff09;&#xff0c;它都會獨立處理這個請求&#xff0c;完全不記得之前任何的交互。這在構建一次性問答應用時沒問題&#…

基于定制開發開源AI智能名片S2B2C商城小程序的社群游戲定制策略研究

摘要&#xff1a;本文聚焦社群游戲定制領域&#xff0c;深入探討以社群文化和用戶偏好為導向的定制策略。通過分析互動游戲活動、社群文化塑造等關鍵要素&#xff0c;結合定制開發開源AI智能名片S2B2C商城小程序的技術特性&#xff0c;提出針對性游戲定制方案。研究旨在提升社群…

自動駕駛決策與規劃

目錄 自動駕駛決策與規劃概述 決策與規劃體系結構 分層遞階式決策規劃 反應式體系結構 混合式體系結構 決策與規劃系統的關鍵環節 路徑規劃 軌跡規劃 行為決策 異常處理 自動駕駛的路徑規劃技術 維諾圖法 柵格法 Dijkstra算法 A*算法 自動駕駛的行為決策方法 …

C++編譯期計算:常量表達式(constexpr)全解析

在C性能優化領域&#xff0c;"將計算盡可能轉移到編譯期"是一條黃金法則。編譯期計算&#xff08;Compile-Time Computation&#xff09;能顯著減少程序運行時的開銷&#xff0c;提升執行效率&#xff0c;同時還能在編譯階段暴露潛在錯誤。C11引入的constexpr關鍵字及…

【micro:bit】從入門到放棄(一):在線、離線版本的使用

1、離線版 micro:bit 1)下載地址 https://makecode.microbit.org/offline-app 2)雙擊安裝包,makecode-microbit-setup-win64.exe,自動安裝,安裝成功后圖標如下圖所示 3)運行程序,查看版本信息 4)主界面如下 5)編程界面 點擊“新建項目”或者“導入”進入編程界…

Flink Forward Asia 2025 主旨演講精彩回顧

作為 Apache Flink 社區備受矚目的年度盛會之一&#xff0c;由阿里云承辦的 Flink Forward Asia 2025 于 7 月 3 日在新加坡正式拉開帷幕。From Real-Time Data Analytics to Real-Time AI&#xff0c;Flink 生態全面擁抱 AI本次大會上&#xff0c;Apache Flink 中文社區發起人…

車道偏離預警(LDW)功能介紹

車道偏離預警&#xff08;LDW&#xff09;功能介紹 LDW功能 通過攝像頭監測前方車道線&#xff0c;當車輛偏離車道線時&#xff0c;系統發出報警提醒。 系統框圖報警條件 最早報警線最遲報警線報警臨界線 設置在 最早/最遲報警線 之間接口定義 輸入/輸出系統算法 橫向偏離速度模…

軟考(軟件設計師)計算機網絡-網絡層

obsidian做markdown筆記太爽了&#xff0c;康奈爾模板筆記看起來舒服&#xff0c;CSDN試了幾種方式&#xff0c;不支持&#xff0c;只能貼圖了&#xff0c;將就看吧&#x1f60f;&#xff08;狗頭保命&#xff09;工作原理圖解 #mermaid-svg-e5Tgpt26jUftujKn {font-family:&qu…

nginx反向代理實現跨域請求

記錄一個項目中遇到的跨域請求問題&#xff0c;解決跨域問題無非幾種辦法&#xff1a;1、后端解決&#xff0c;推薦的做法&#xff0c;可以看我之前寫的文章&#xff0c;fastadmin的后臺配置跨域&#xff1b;2、前端配置proxy代理&#xff08;開發環境用&#xff09;&#xff1…

利用Wisdom SSH高效搭建CI/CD工作流

在軟件開發流程中&#xff0c;CI/CD工作流對于提升效率與確保質量起著關鍵作用。Wisdom SSH作為一款強大工具&#xff0c;其官網為ssh.wisdomheart.cn&#xff0c;借助AI助手能大幅簡化CI/CD工作流的搭建過程。假設服務器已完成基礎配置&#xff0c;下面為您介紹如何利用Wisdom…

深度學習-循環神經網絡RNN

文章目錄序列模型循環神經網絡案例詞的表示輸出的表示矩陣運算表示交叉熵損失時間反向傳播算法BPTT梯度消失與梯度爆炸GRULSTM總結序列模型 循環神經網絡 st是上一個隱層的輸出&#xff0c;體現序列數據之間有很強的關聯性。 案例 > S0是初始輸入&#xff0c;一般是0&#…