C++:設計模式--工廠模式


更多內容:XiaoJ的知識星球


目錄

  • 1.簡單工廠模式
    • 1.1 簡單工廠
    • 1.2 實現步驟
    • 1.3 實現代碼
    • 1.4 優缺點
  • 2.工廠模式
    • 2.1 工廠模式
    • 2.2 實現步驟
    • 2.3 實現代碼
    • 2.4 優缺點
  • 3.抽象工廠模式
    • 3.1 抽象工廠模式
    • 3.2 實現步驟
    • 3.3 實現代碼
    • 3.4 優缺點


1.簡單工廠模式

.

1.1 簡單工廠

簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式

通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

.

1.2 實現步驟

1.提供一個工廠類

  • 簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。

2.提供一個抽象產品類

  • 簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。

3.提供一個具體產品類

  • 簡單工廠模式所創建的具體實例對象

在這里插入圖片描述

.

1.3 實現代碼

#include <iostream>
#include <string>
using namespace std;
//產品抽象父類
class Operation 
{    public:double m_leftVlaue;double m_rightValue;virtual double GetResult() = 0;
};
//具體產品實現類
class AddOperation:public Operation
{double GetResult(){return m_leftVlaue + m_rightValue;}
};
class SubOperation :public Operation 
{double GetResult(){return m_leftVlaue - m_rightValue;}
};class MulOperation :public Operation
{double GetResult(){return m_leftVlaue * m_rightValue;}
};class DivOperation :public Operation
{double GetResult(){return m_leftVlaue / m_rightValue;}
};
//工廠類
class  OperatorFactory 
{
public:static  Operation* createOperation(char c) {switch (c) {case '+':return new AddOperation;break;case '-':return new SubOperation;break;case '*':return new MulOperation;break;case '/':return new DivOperation;break;}}
};
int main() 
{Operation* operation = OperatorFactory::createOperation('+');operation->m_leftVlaue = 1;operation->m_rightValue = 2;cout << operation->GetResult() << endl;return 0;
}

1.4 優缺點

優點

  • 幫助封裝:實現組件封裝,面向接口編程

  • 解耦合:客戶端和具體實現類的解耦合

缺點

  • 可能增加客戶端的復雜度

  • 不方便擴展子工廠

.


2.工廠模式

2.1 工廠模式

工廠方法模式,同樣屬于類的創建型模式,又被稱為多態工廠模式 。

工廠方法模式的意義:

  • 定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。

  • 核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,

  • 這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工 廠角色的情況下引進新的產品

.

2.2 實現步驟

1.提供一個抽象工廠類 :所有具體工廠類的父類

2.提供與產品對應的工廠類:負責實例化產品對象

3.提供一個抽象產品類:所有產品的父類

4.提供一個或多個產品類:工廠方法模式所創建的具體實例對象
在這里插入圖片描述
.

2.3 實現代碼

#include <iostream>
using namespace std;
class AbstractProduct
{
public:virtual void makeProduct() = 0;
};class AbstractFactory 
{
public:virtual AbstractProduct* createProduct() = 0;
};class PlaneProduct :public AbstractProduct
{
public:void makeProduct() {cout << "造飛機....." << endl;}
};
class PlaneFactory :public AbstractFactory 
{
public:AbstractProduct* createProduct(){AbstractProduct* product = new PlaneProduct;return product;}
};
class RocketProduct :public AbstractProduct
{
public:void makeProduct(){cout << "造火箭...." << endl;}
};
class RocketFactory :public AbstractFactory 
{
public :AbstractProduct* createProduct(){AbstractProduct* product = new RocketProduct;return product;}
};int main() 
{//造飛機AbstractFactory* factory = new PlaneFactory;AbstractProduct* product = factory->createProduct();product->makeProduct();//造火箭factory = new RocketFactory;product = factory->createProduct();product->makeProduct();return 0;
}

.

2.4 優缺點

優點

  • 需求改變時改動最小

  • 具體的創建實例過程與客戶端分離

缺點:

  • 新增功能時,工程量稍大

.


3.抽象工廠模式

3.1 抽象工廠模式

抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。

抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品族的產品對象。

.

3.2 實現步驟

1.提供一個抽象工廠類:聲明一組創建一族產品的工廠方法

2.提供一個具體工廠類:實現了在抽象工廠創建產品的工廠方法

3.提供一個抽象產品類:抽象產品中聲明了產品具有的業務方法

4.提供一個具體產品類:實現抽象產品接口中聲明的業務方法
在這里插入圖片描述

.

3.3 實現代碼

#include <iostream>
using namespace std;
//抽象產品
class Product 
{
public:virtual void show() = 0;
};
//抽象產品族1
class KeyBoard :public Product{};
//羅技鍵盤
class LogiKeyBoard :public KeyBoard
{void show(){cout << "羅技鍵盤......" << endl;}
};
//雷蛇鍵盤
class RazerKeyBoard :public KeyBoard
{void show() {cout << "雷蛇鍵盤......" << endl;}
};
//抽象產品族2
class Mouse :public Product {};
//羅技鼠標
class LogiMouse :public Mouse
{void show() {cout << "羅技鼠標......" << endl;}
};
class RazerMouse :public Mouse 
{void show() {cout << "雷蛇鼠標......" << endl;}
};
//抽象工廠
class Factory
{
public:virtual KeyBoard* createKeyBoard() = 0;virtual Mouse* createMouse() = 0;
};
class LogiFactory :public Factory
{KeyBoard* createKeyBoard(){return new LogiKeyBoard;}Mouse* createMouse() {return new LogiMouse;}
};
class RazerFactory :public Factory 
{KeyBoard* createKeyBoard() {return new RazerKeyBoard;}Mouse* createMouse() {return new RazerMouse;}
};int main() 
{Factory* factory = new LogiFactory;KeyBoard* keyBoard = factory->createKeyBoard();Mouse* mouse = factory->createMouse();keyBoard->show();mouse->show();delete factory;delete keyBoard;delete mouse;factory = new RazerFactory;keyBoard = factory->createKeyBoard();mouse = factory->createMouse();keyBoard->show();mouse->show();delete factory;delete keyBoard;delete mouse;factory = NULL;keyBoard = NULL;mouse = NULL;return 0;
}

.

3.4 優缺點

優點

  • 抽象工廠封裝了變化,封裝了對象創建的具體細節

  • 增加新的產品族很方便,無須修改已有系統

  • 針對接口進行編程而不是針對具體進行編程

缺點:

  • 增加新的產品等級結構需對原系統做較大修改(違背開放封閉)

.


聲明:資源可能存在第三方來源,若有侵權請聯系刪除!

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

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

相關文章

【DSP筆記】掌握數字世界的律動:時域離散信號與系統基礎

掌握數字世界的律動&#xff1a;時域離散信號與系統基礎 想象一下&#xff0c;你用手機拍了一張照片&#xff0c;或者聽了一首MP3歌曲。這些圖片和聲音&#xff0c;原本都是連續變化的模擬信號&#xff0c;但為什么它們能被你的手機存儲和處理呢&#xff1f;秘密就在于“數字化…

織夢dedecms上傳附件不自動改名的辦法

織夢dedecms的系統在上傳附件后&#xff0c;會將文件自動改名字&#xff0c;那怎么樣才能讓附件上傳后不自動改名字呢&#xff0c;讓附件上傳后不自動改名字(中文名的附件將會改成拼音文件名稱)&#xff0c;現在說一下方法吧&#xff1a; 我們打開網站目錄下include\dialog\se…

https下git拉取gitlab倉庫源碼

git init 創建倉庫 參考下面創建公私秘鑰對 GitLab配置ssh key - 阿豪聊干貨 - 博客園 Your identification has been saved in /home/xxx/.ssh/id_ed25519 Your public key has been saved in /home/xxx/.ssh/id_ed25519.pub 然后查看對應公鑰&#xff0c;復制 cat ~/.ss…

Mybatis使用update更新值為null時不生效問題解決

1.出現的問題 前端修改數據時把屬性內容刪除然后進行保存&#xff0c;默認傳的null&#xff0c;后端更新時屬性值為null&#xff0c; 然后調用updateById進行更新時發現該屬性還是原來的值&#xff1a; update方法不會對屬性null的進行更新 2.原因 mybatis-plus FieldStrat…

JAVA 學習日志

$2 周期小結 #8 工作匯報 數學建模部分 前三天的主要精力用在電工杯數學建模大賽上了&#xff0c;雖然這是Java學習筆記 當是還是總結一下吧 首先是任務分工方面 需要三個人都會python基礎語法 然后一起寫論文 &#xff0c;就是需要邊建模邊寫論文 &#xff0c;然后在 后續…

Java網絡編程性能優化

1.網絡編程性能優化基礎 1. 性能關鍵指標 指標 描述 優化目標 響應時間 從請求到響應的總時間 降低到毫秒級 吞吐量 單位時間內處理的請求數量 提高到每秒數千至數萬請求 并發用戶數 系統同時處理的用戶數量 支持數千至數萬并發連接 資源利用率 CPU、內存、網絡帶…

react native搭建項目

React Native 項目搭建指南 React Native 是一個使用 JavaScript 和 React 構建跨平臺移動應用的框架。以下是搭建 React Native 項目的詳細步驟&#xff1a; 1. 環境準備 安裝 Node.js 下載并安裝 Node.js (推薦 LTS 版本) 安裝 Java Development Kit (JDK) 對于 Androi…

Redis 容器啟動失敗Fatal error loading the DB, check server logs. Exiting.的解決方法

? 問題分析&#xff1a;Redis 容器啟動失敗 根據提供的 Redis 啟動日志&#xff0c;關鍵信息如下&#xff1a; &#x1f50d; 模塊加載情況 模塊名稱狀態備注RedisCompat? 成功search? 成功RediSearch 模塊timeseries? 成功RedisTimeSeries 模塊ReJSON? 成功bf? 成功R…

chrome打不開axure設計的軟件產品原型問題解決辦法

1、打開原型文件夾&#xff0c;進入到其中的如下目錄中&#xff1a;resources->chrome->axure-chrome-extension.crx&#xff0c;找到 Axure RP Extension for Chrome插件。 2、axure-chrome-extension.crx文件修改擴展名.rar&#xff0c;并解壓到文件夾 axure-chrome-ex…

Java 各版本核心新特性的詳細說明

一、Java 8&#xff08;2014&#xff09;—— 函數式編程的里程碑 1. Lambda 表達式 作用&#xff1a;簡化匿名內部類&#xff0c;支持函數式編程。示例&#xff1a;// 傳統匿名內部類 Runnable r1 new Runnable() {Overridepublic void run() {System.out.println("He…

【md2html python 將 Markdown 文本轉換為 HTML】

測試md文本 md_text """ # title## subtitle\python print("Hello, World!") \- item 1| Header 1 | Header 2 | |----------|----------| | Row 1 Col 1 | Row 1 Col 2 |- item 2> This is a blockquote.### SubsubtitleThis is a paragraph wi…

Prompt Engineering 提示工程介紹與使用/調試技巧

1. 介紹 Prompt Engineering 是一種人工智能&#xff08;AI&#xff09;技術&#xff0c;它通過設計和改進 AI 的 prompt 來提高 AI 的表現。Prompt Engineering 的目標是創建高度有效和可控的 AI 系統&#xff0c;使其能夠準確、可靠地執行特定任務。 如果你從來沒有使用過Pr…

如何把 Microsoft Word 中所有的漢字字體替換為宋體?

Ctrl H &#xff0c;然后&#xff0c;點擊更多&#xff0c;勾選使用通配符&#xff0c;查找內容中填入 [一-龥]{1,}&#xff0c; 這是 Word 通配符匹配漢字的經典寫法&#xff08;匹配 Unicode 范圍內的 CJK 漢字&#xff09;。 然后&#xff0c; “替換為”留空&#xff0c;點…

CMake從入門到實戰:現代C++項目構建指南

CMake從入門到實戰&#xff1a;現代C項目構建指南 引言 在跨平臺開發成為主流的今天&#xff0c;CMake作為開源構建系統的標桿工具&#xff0c;憑借其跨平臺性、靈活性和可擴展性&#xff0c;已成為C/C項目的事實標準。本文將帶你系統掌握CMake的核心機制&#xff0c;通過實戰…

Web安全滲透之長城杯奪旗賽

Web-Git flag1 掃描WEB目錄發現存在Git泄露&#xff08;這里是隊友掃的&#xff0c;我這圖是拿的我后面掃的截圖&#xff0c;所以時間對不上。 使用GitHub - gakki429/Git_Extract: 提取遠程 git 泄露或本地 git 的工具拉取泄露代碼。 讀取到flag&#xff0c;全場一血捏。…

機器學習與深度學習:區別與聯系

機器學習與深度學習&#xff1a;區別與聯系 在人工智能領域&#xff0c;機器學習和深度學習是兩個最熱門的概念&#xff0c;它們既相互關聯又有所區別。本文將深入探討這兩者的核心差異與內在聯系&#xff0c;幫助讀者更好地理解它們在實際應用中的定位。 一、基本概念 **機…

Linux TCP與Socket與IO多路復用(Epoll)

目錄 一、背景 二、交互流程 2.1 數據流動 2.2 對象之間的關系 三、TCP 3.1 為什么需要三次握手 3.2 三次握手流程 3.3 三次握手后的產物 3.4 TCB 四、Socket 4.1 Java Socket和C Socket 4.2 Socket的本質 4.3 Socket和TCB的關系 4.4 通過文件描述符調用Socket的…

字節跳動旗下火山引擎都覆蓋哪些領域

首先&#xff0c;我需要確認火山引擎的主要業務范圍。根據之前的資料&#xff0c;火山引擎是字節跳動的企業技術服務平臺&#xff0c;可能包括云服務、人工智能、大數據分析等。不過需要更詳細的信息&#xff0c;比如具體的產品和服務&#xff0c;覆蓋的行業等。 接下來&#x…

如何配置jmeter做分布式壓測

問&#xff1a;為何需要做分布式 答&#xff1a;當我們本地機器jmeter進行壓測時&#xff0c;單臺JMeter機器通常無法穩定生成2000 QPS&#xff08;受限于CPU、內存、網絡帶寬&#xff09;&#xff0c;本地端口耗盡&#xff1a;操作系統可用的臨時端口&#xff08;Ephemeral P…

【算法提升】牛牛沖鉆五 最長無重復子數組 重排字符串 one_day

算法提升 1.牛牛沖鉆五1.2 解析 2.最長無重復子數組2.1解析 3.重排字符串3.1解析 1.牛牛沖鉆五 1.2 解析 后面的數據要根據前面兩個的狀態來確定&#xff0c;我的做法是使用動態規劃的方式 #include<iostream> #include<string> #include<vector> using n…