設計模式---3(工廠方法模式的概念,工廠方法模式的實現,工廠方法模式和簡單工廠模式比較)

工廠方法模式

概念

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

工廠方法模式的意義

定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。 核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類 必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
在這里插入圖片描述

工廠方法模式的角色和職責

抽象工廠(Creator)角色

工廠方法模式的核心,任何工廠類都必須實現這個接口。

具體工廠( Concrete Creator)角色

具體工廠類是抽象工廠的一個實現,負責實例化產品對象。

抽象(Product)角色

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

具體產品(ConcreteProduct)角色

工廠方法模式所創建的具體實例對象

在這里插入圖片描述

工廠方法模式的實現

#include<iostream>
using namespace std;//抽象水果
class AbstractFruit{
public:virtual void ShowName() = 0;};//蘋果
class Apple :public AbstractFruit{virtual void ShowName(){cout << "我是蘋果" << endl;}
};//香蕉
class Banana :public AbstractFruit{
public:virtual void ShowName(){cout << "我是香蕉" << endl;}
};//梨子
class Pear :public AbstractFruit{
public:virtual void ShowName(){cout << "我是梨子" << endl;}
};//把工廠抽象出來
class AbstractFruitFactory{
public:virtual AbstractFruit* CreateFruit() = 0;};
//蘋果工廠
class AppleFactiry :public AbstractFruitFactory{
public:virtual AbstractFruit *CreateFruit(){return new Apple;}
};
//香蕉工廠
class BananaFactory :public AbstractFruitFactory{
public:virtual AbstractFruit * CreateFruit(){return new Banana;}
};//梨子工廠
class PearFactory :public AbstractFruitFactory{
public:virtual AbstractFruit * CreateFruit(){return new Pear;}
};void test01(){AbstractFruitFactory *factory = NULL;AbstractFruit *fruit = NULL;//創建蘋果工廠factory = new AppleFactiry;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;//創建一個香蕉工廠factory = new BananaFactory;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;//創建一個梨子工廠factory = new PearFactory;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;
}int main(void)
{test01();system("pause");return 0;
}

工廠方法模式的優點

  1. 不需要記住具體類名,有時不需要記住具體參數
  2. 實現了對象創建和使用的分離
  3. 系統的可擴展性也的非常好,無需修改接口和原類。

工廠方法模式的缺點

  1. 類的個數成本增加,導致類越來越多,增加維護成本
  2. 判斷邏輯在客戶端,需要自己判斷新加的產品是否需要新建工廠。

工廠方法模式和簡單工廠模式比較

  1. 工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法類的核心是一個抽 象工廠類,而簡單工廠模式把核心放在一個具體類上。
  2. 工廠方法模式之所以有一個別名叫多態性工廠模式是因為具體工廠類都有共同的接口, 或者有共同的抽象父類。
  3. 當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對 象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉” 原則。而簡單工廠模式在添加新產品對象后不得不修改工廠方法,擴展性不好。工廠方法模 式退化后可以演變成簡單工廠模式
簡單工廠模式的適用場景

在這里插入圖片描述

工廠方法模式的適用場景

在這里插入圖片描述

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

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

相關文章

設計模式---4(抽象工廠模式的概念,產品組和產品等級的概念,抽象工廠模式的實現)

抽象工廠模式 抽象工廠模式的概念 抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向 客戶端提供一個接口&#xff0c;使得客戶端在不必指定產品的具體類型的情況下&#xff0c;能夠創建多個產品 族的產品對象。 抽象工廠的角色及其職責 抽象工…

Win32項目關于MessageBox參數的詳細說明

函數功能&#xff1a;該函數創建、顯示、和操作一個消息框。消息框含有應用程序定義的消息和標題&#xff0c;加上預定義圖標與Push&#xff08;下按&#xff09;按鈕的任何組合。 函數原型&#xff1a;int MessageBox(HWND hWnd,LPCTSTR IpCaption,UINT…

w3af解析

1. w3af簡介 w3afis a Web Application Attack and Audit Framework.即Web應用攻擊和審計框架。w3af用python編寫&#xff0c;依賴的庫主要有2類&#xff0c;分別如下&#xff1a; <1> Core requirements: Python 2.6 fpconst-0.7.2&#xff1a;用于處理IEEE 754浮點…

1.c++中初始化列表和構造函數初始化的區別是什么?2.類的成員變量的初始化順序是按照聲明順序嗎?

初始化列表和構造函數初始化的區別是什么&#xff1f; 初始化和賦值對內置類型的成員沒有太大的區別&#xff0c;在成員初始化列表和構造函數體內進行&#xff0c;在性能和結果上都是一樣的。只有一些需要注意的事項 初始化列表一般情況如下&#xff1a; Date(int year, int …

設計模式---5(建造者模式的概念及其實現,建造者模式的角色與職責,建造者模式和工廠模式的區別)

建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式&#xff0c;是由 GoF 提出的 23 種設計模式中的一種。 Builder 模式是一種對象創建型模式之一&#xff0c;用來隱藏復合對象的創建過程&#xff0c;它把復合對象的 創建過程加以抽象&#xff0c;通過子…

system阻塞SIGCHLD信號原因

system阻塞SIGCHLD信號原因 標簽&#xff1a; c 2014-11-08 11:58 198人閱讀 評論(0) 收藏 舉報 分類&#xff1a; linux編程&#xff08;1&#xff09; 代碼1&#xff1a;APUE10.18節的system函數源代碼 int system(const char *cmdstring) /* with appropriate signal ha…

設計模式6---(單例模式的概念及其實現(懶漢式和餓漢式),線程安全)

單例模式 單例模式的概念 單例模式是一種對象創建型模式&#xff0c;使用單例模式&#xff0c;可以保證為一個類只生成唯一的實例對象。也就是說&#xff0c;在整個程序空間中&#xff0c;該類只存在一個實例對象。 GoF 對單例模式的定義是&#xff1a;保證一個類、只有一個實…

C語言解析http請求表單內容

[1].[文件] cgi.h ~ 405B 下載(105) 跳至 [1] [2] [3] [4] [5] [6] [7] [8] ?123456789101112131415161718192021222324252627#ifndef CGI_H#define CGI_H#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct Node{char *…

centos給用戶添加sudo權限

linux給用戶添加sudo權限&#xff1a; 有時候&#xff0c;linux下面運行sudo命令&#xff0c;會提示類似&#xff1a; xxxis not in the sudoers file. This incident will be reported. 這里&#xff0c;xxx是用戶名稱&#xff0c;然后導致無法執行sudo命令&#xff0c;這時候…

php手冊

http://www.php100.com/manual/php/ http://www.kuqin.com/php5_doc/

套接字編程---2(TCP套接字編程的流程,TCP套接字編程中的接口函數,TCP套接字的實現,TCP套接字出現的問題,TCP套接字多進程版本,TCP套接字多線程版本)

TCP模型創建流程圖 TCP套接字編程中的接口 socket 函數 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 這是大多數用來產生socket的協議&#xff0c;使用TCP或UDP來傳輸&…

安全關注

http://yttitan.blog.51cto.com/70821/1576365

Linux中netstat工具詳解

簡介 Netstat 命令用于顯示各種網絡相關信息&#xff0c;如網絡連接&#xff0c;路由表&#xff0c;接口狀態 (Interface Statistics)&#xff0c;masquerade 連接&#xff0c;多播成員 (Multicast Memberships) 等等。 常見參數 -a (all)顯示所有選項&#xff0c;默認不顯示…

網絡基礎 2-1(應用層,HTTP三點注意,HTTP協議格式, 最簡單的HTTP服務器)

應用層 應用層 負責應用程序之間的數據溝通-----協議都是用戶自己定的 自定制協議&#xff1a; 結構化數據傳輸 序列化&#xff1a; 將數據對象以指定的協議&#xff08;數據格式&#xff09;進行可用于持久化存儲或者數據傳輸時的數據組織 例如在分布式的系統中&#xf…

正則表達式 學習

http://regexr.com/ 在線匹配 http://c.biancheng.net/cpp/html/1434.html 查詢網址

網絡基礎2-2(傳輸層,端口,詳談UDP)

傳輸層 負責數據能夠從發送端傳輸接收端. 端口號 端口號(Port)標識了一個主機上進行通信的不同的應用程序;在TCP/IP協議中, 用 “源IP”, “源端口號”, “目的IP”, “目的端口號”, “協議號” 這樣一個五元組來標識一個通信(可以通過 netstat -n查看);一個端口只能被一個…

中文rfc文檔路徑

http://man.chinaunix.net/develop/rfc/default.htm

網絡基礎2-3(TCP協議,三次握手,四次揮手,TIME_WAIT狀態的作用,TCP如何保證可靠傳輸,TCP連接中狀態轉化,滑動窗口,流量控制,快速重傳,擁塞窗口,延遲應答,捎帶應答,粘包問題)

TCP協議 TCP協議概念 TCP全稱為 “傳輸控制協議(Transmission Control Protocol”). 人如其名, 要對數據的傳輸進行一個詳細的控制 TCP協議格式 1. 源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去; 2. 32位序號/32位確認號: 后面詳細講; 3. 4位TCP報頭長度: 表示該…

超時設置

//read操作加上超時時間。1 int read_timeout(int fd, void *buf, uint32_t count, int time)2 {3 if(time > 0) {4 fd_set rSet;5 FD_ZERO(&rSet);6 FD_SET(fd, &rSet);7 8 struct timeval timeout;9 memset(&tim…

字符串題目 1 --------判斷兩個字符串是否為旋轉詞

題目描述 如果一個字符串為str&#xff0c;把字符串的前面任意部分挪到后面形成的字符串交str的旋轉詞。比如str“12345”&#xff0c;str的旋轉串有“12345”、“45123”等等。給定兩個字符串&#xff0c;判斷是否為旋轉詞。 輸入描述: 輸出包含三行&#xff0c;第一個兩個…