C++設計模式之工廠模式(中)——工廠模式

工廠模式

  • 工廠模式
    • 介紹
    • 示例
    • 示例使用
    • 運行結果
    • 工廠模式與簡單工廠模式區別

工廠模式

工廠模式在簡單工廠模式的基礎之上進行了改進。當需要生產的產品種類增加,可以通過新增子類工廠來生產,沒有破壞程序設計原則中的開放封閉原則。

介紹

工廠模式先抽象出一個抽象工廠,再子類化抽象工廠,將對應產品對象的創建放在子類工廠中。也就是一個子工廠負責生產一種產品,即具體的產品對象由對應的具體的子工廠創建。當產品種類增加,只需增加新的子工廠來生產,遵守開放封閉原則。

示例

本示例接上篇的簡單工廠模式。在原本示例的基礎上進行改進。將采用簡單工廠設計模式的示例改為采用工廠設計模式的示例。

class PenHolder 
{
public:virtual void introduce() = 0;
};class PlasticPenHolder :public PenHolder 
{
public:void introduce()override {cout << "I am PlasticPenHolder!" << endl;}
};class IronPenHolder :public PenHolder 
{
public:void introduce()override {cout << "I am IronPenHolder!" << endl;}
};class BaseFactory 
{
public:virtual PenHolder * createPenHolder() = 0;
};class PlasticFactory :public BaseFactory 
{
public:PenHolder* createPenHolder()override {return new PlasticPenHolder;}
};class IronFctory :public BaseFactory 
{
public:PenHolder* createPenHolder() override{return new IronPenHolder;}
};

示例使用

int main() 
{cout << "工廠模式輸出:" << endl;BaseFactory *baseFactory1 = new PlasticFactory;PenHolder* penHolder1 = baseFactory1->createPenHolder();penHolder1->introduce();delete penHolder1;delete baseFactory1;BaseFactory *baseFactory2 = new IronFctory;PenHolder* penHolder2 = baseFactory2->createPenHolder();penHolder2->introduce();delete penHolder2;delete baseFactory2;return 0;
}

運行結果

在這里插入圖片描述

工廠模式與簡單工廠模式區別

相同點:
簡單工廠模式和抽象工廠模式都是創建型設計模式。
不同點:
1.簡單工廠模式只有一個工廠類,通過該工廠類生產不同的產品,代碼結構簡單易懂。工廠模式先是抽象出一個抽象工廠類,在抽象工廠類中提煉出一個純虛的工廠函數,派生出不同的子工廠類,重寫抽象類中的工廠函數,生產不同的產品對象,一種產品對應一個子工廠類,相對于簡單工廠代碼復雜性增加。
2.簡單工廠模式當產品的種類增加時,需要修改工廠函數,破環了開放封閉原則。工廠模式當產品種類增加,只需增加新的子工廠類來生產新的產品,遵守了程序設計的開放封閉原則,具有很好的擴展性和易維護性。但也有一個弊端:當產品種類很多的時候,從抽象工廠類派生的子工廠類就會很多,造成了程序的繼承過大。
3.建檔工廠模式適用于需求相對簡單的產品創建。工廠模式適用于復雜產品的創建需求。

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

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

相關文章

1.2.1 C語言結構體初始化方法總結

文章目錄 結構體定義通用定義注冊事項結構體初始化方法一簡述示例方法二簡述示例方法三簡述示例方法四簡述示例方法五簡述示例結構體定義 通用定義 常用的結構體定義,有2種形式, 一種是關鍵字struct 結構體形式,如下

域控操作五:統一熄屏睡眠時間

直接看圖路徑&#xff0c;我只設置了熄屏&#xff0c;如果要睡眠就下面那個啟用設置時間

Pytorch中的Tensorboard常用API

SummaryWriter函數 這個函數用于創建一個tensorboard文件&#xff0c;其中常用參數有 log_dir&#xff1a;tensorboard文件的存放路徑。不設置log_dir默認會在當前程序所在的文件夾下創建個runs文件夾存儲flush_secs&#xff1a;表示寫入tensorboard文件的時間間隔comment&…

一文2000字使用JMeter進行接口測試教程!(建議收藏)

安裝 使用JMeter的前提需要安裝JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下載解壓使用 運行 進入解壓路徑如E: \apache-jmeter-5.2\bin&#xff0c;雙擊jmeter.bat啟動運行 啟動后默認為英文版本&#xff0c;可通過Options – Cho…

IIC驅動OLED HAL庫+CubeMX

一.IIC傳輸數據的格式 1.寫操作 2.讀操作 3.IIC信號 二. IIC底層驅動 #define SCL_PIN GPIO_PIN_6 #define SDA_PIN GPIO_PIN_7#define SCL_PORT GPIOB #define SDA_PORT GPIOB/********************** 函數宏定義 **********************/ #d…

Navicat 技術指引 | 連接 GaussDB 主備版

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

LangChain(0.0.339)官方文檔一:快速入門

LangChain官網、LangChain官方文檔 、langchain Github、langchain API文檔、llm-universe 文章目錄 一、LangChain簡介&#xff08;v0.0.338&#xff09;1.1 整體框架1.2 主要組件1.2.1 Model I/O1.2.2 Retrieval1.2.2.1 RAG1.2.2.2 Retrieval 1.2.3 Chain 1.3 其它組件1.3.1 …

STM32筆記---RTC

目錄 一、RTC簡介 二、主要特性 三、功能描述 3.1 讀RTC寄存器 3.2 配置RTC寄存器 四、BKP簡介 五、RTC_Init() 1. 函數BKP_ReadBackupRegister 2.RCC_LSEConfig設置外部低速晶振&#xff08;LSE&#xff09; 3.RTC基本結構 5.RTC_Init()實現 6.time.h 一、R…

九州未來聯合聯通智網科技發布白皮書,促進車聯網融合發展

2023年11月21日&#xff0c;由2023中國5G工業互聯網大會組委會、工業和信息化部主辦&#xff0c;聯通智網科技承辦的2023中國5G工業互聯網大會——5G車聯網與智慧交通創新發展平行會議&#xff0c;在武漢成功舉辦。 九州未來作為中國聯通車聯網創新聯合體成員單位&#xff0c;受…

【Sql】sql server還原數據庫的時候,提示:因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權。

【問題描述】 sql server 還數據庫的時候&#xff0c;提示失敗。 點擊左下角進度位置&#xff0c;可以得到詳細信息&#xff1a; 因為數據庫正在使用&#xff0c;所以無法獲得對數據庫的獨占訪問權。 【解決方法】 針對數據庫先后執行下述語句&#xff0c;獲得獨占訪問權后&a…

【Leetcode合集】2824. 統計和小于目標的下標對數目

2824. 統計和小于目標的下標對數目 2824. 統計和小于目標的下標對數目 代碼倉庫地址&#xff1a; https://github.com/slience-me/Leetcode 個人博客 &#xff1a;https://slienceme.xyz 給你一個下標從 0 開始長度為 n 的整數數組 nums 和一個整數 target &#xff0c;請你…

線性空間(也叫向量空間)、線性運算

線性空間、線性運算 線性空間&#xff0c;也稱向量空間。 假設是一個非空集合&#xff0c;是一個實數域。 在中定義了一個加法&#xff1a;即對中任何兩個元素和&#xff0c;總有中另外一個元素與它們相對應&#xff0c;稱為和的和&#xff0c;記作&#xff1a; 在定義了一個…

mac電腦系統活動監控:iStat Menus 中文 for Mac

iStat Menus是一款Mac操作系統上的系統監控工具&#xff0c;它提供了實時的系統狀態和性能數據&#xff0c;讓用戶可以方便地監控和管理自己的電腦。iStat Menus以菜單欄圖標的形式顯示各種系統指標&#xff0c;用戶可以輕松訪問和查看這些信息。 以下是iStat Menus軟件的一些…

debian 設置系統默認以命令行方式啟動,關閉x windows

debian 設置系統默認以命令行方式啟動&#xff0c;關閉x windows 2021-01-02 tech linux 設置 grub啟動設置在/etc/default/grub中&#xff0c;打開 default grub 配置: $ sudo vim /etc/default/grub修改以下配置&#xff1a; 更新grub&#xff0c;設置多用戶啟動: …

針對MySql知識的回顧

MySql雖然是一個相對簡單的關系型數據庫&#xff0c;但也是一個最常用的數據庫&#xff0c;也是一個非常經典的數據庫&#xff0c;很多云產品也是基于MySql做了二開&#xff0c;從而變得非常強大&#xff0c;其中MySql最常用的是Innodb引擎&#xff0c;因為該引擎支持事務&…

第14章 多線程三 (線程同步)

目錄 內容說明 章節內容 1、為什么需要多線程同步? 2、Java如何實現多線程同步?

CUDA學習筆記9——CUDA 共享內存 / Shared Memory

由于共享內存擁有僅次于寄存器的讀寫速度&#xff0c;比全局內存快得多。因此&#xff0c;能夠用共享內存訪問替換全局內存訪問的場景都可以考慮做對應的優化。 不利用共享內存的矩陣乘法 不利用共享內存的矩陣乘法的直接實現。每個線程讀取A的一行和B的一列&#xff0c;并計…

『Linux升級路』基礎開發工具——gcc/g++篇

&#x1f525;博客主頁&#xff1a;小王又困了 &#x1f4da;系列專欄&#xff1a;Linux &#x1f31f;人之為學&#xff0c;不日近則日退 ??感謝大家點贊&#x1f44d;收藏?評論?? 目錄 一、快速認識gcc/g 二、預處理 &#x1f4d2;1.1頭文件展開 &#x1f4d2;1…

java字符串的常見用法

java字符串的常見用法 Java中的字符串是一個非常常用的對象&#xff0c;它屬于Java的內置類String類的實例。字符串在Java中是不可變的&#xff0c;即一旦創建了一個字符串對象&#xff0c;就不能修改它的值。 下面是一些關于Java字符串的詳細用法&#xff1a; 1&#xff09;創…

從零開始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交給時間 &#x1f3e0; &#xff1a;小破站 "從零開始&#xff0c;用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合 前言準備工作編寫docker-compose.yml文件為什么使用本機ip為什么skywa…