亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之工廠模式

2020-01-26 14:35:31
字體:
來源:轉載
供稿:網友

由遇到的問題引出工廠模式

在面向對象系統設計中經??梢杂龅揭韵碌膬深悊栴}:

◆ 1.為了提高內聚(Cohesion)和松耦合(Coupling),我們經常會抽象出一些類的公共接口以形成抽象基類或者接口。這樣我們可以通過聲明一個指向基類的指針來指向實際的子類實現,達到了多態的目的。這里很容易出現的一個問題 n 多的子類繼承自抽象基類,我們不得不在每次要用到子類的地方就編寫諸如 new ×××;的代碼。這里帶來兩個問題:
客戶程序員必須知道實際子類的名稱(當系統復雜后,命名將是一個很不好處理的問題,為了處理可能的名字沖突,有的命名可能并不是具有很好的可讀性和可記憶性,就姑且不論不同程序員千奇百怪的個人偏好了)。
程序的擴展性和維護變得越來越困難。

◆ 2.還有一種情況就是在父類中并不知道具體要實例化哪一個具體的子類。這里的意思為:假設我們在類 A 中要使用到類 B,B 是一個抽象父類,在 A 中并不知道具體要實例化那一個 B 的子類,但是在類 A 的子類 D 中是可以知道的。在 A 中我們沒有辦法直接使用類似于 new ×××的語句,因為根本就不知道×××是什么。

以上兩個問題也就引出了工廠模式的兩個最重要的功能:

  1. 定義創建對象的接口,封裝了對象的創建;
  2. 使得具體化類的工作延遲到了子類中。

模式選擇

我們通常使用工廠模式來解決上面給出的兩個問題。在第一個問題中,我們經常就是聲明一個創建對象的接口,并封裝了對象的創建過程。工廠這里類似于一個真正意義上的工廠(生產對象)。在第二個問題中,我們需要提供一個對象創建對象的接口,并在子類中提供其具體實現(因為只有在子類中可以決定到底實例化哪一個類)。

第一中情況的工廠的結構示意圖為:

圖 1 所以的工廠模式經常在系統開發中用到,但是這并不是工廠模式的最大威力所在(因為這可以通過其他方式解決這個問題)。工廠模式不單是提供了創建對象的接口,其最重要的是延遲了子類的實例化(第二個問題),以下是這種情況的一個工廠的結構示意圖:

圖 2 中關鍵中工廠模式的應用并不是只是為了封裝對象的創建,而是要把對象的創建放到子類中實現:工廠中只是提供了對象創建的接口,其實現將放在工廠的子類Concrete工廠中進行。這是圖 2 和圖 1 的區別所在。

工廠模式的實現

完整代碼示例(code):工廠模式的實現比較簡單,這里為了方便初學者的學習和參考,將給出完整的實現代碼(所有代碼采用 C++實現,并在 VC 6.0 下測試運行)。

代碼片斷 1:Product.h

//Product.h#ifndef _PRODUCT_H_#define _PRODUCT_H_class Product{ public: virtual ~Product() =0; protected: Product(); //屏蔽構造函數 private:};class ConcreteProduct:publicProduct{ public: ~ConcreteProduct(); ConcreteProduct(); protected: private:};#endif //~_PRODUCT_H_

代碼片斷 2:Product.cpp

//Product.cpp#include "Product.h"#include<iostream>using namespace std;Product::Product(){}Product::~Product(){}ConcreteProduct::ConcreteProduct(){ cout<<"ConcreteProduct...."<<endl;}ConcreteProduct::~ConcreteProduct(){}

代碼片斷 3:Factory.h

//Factory.h#ifndef _FACTORY_H_#define _FACTORY_H_class Product;class Factory{ public: virtual ~Factory() = 0; virtual Product* CreateProduct() = 0; protected: Factory(); private:};class ConcreteFactory:public Factory{ public: ~ConcreteFactory(); ConcreteFactory(); Product* CreateProduct(); protected: private:};#endif //~_FACTORY_H_

代碼片斷 4:Factory.cpp

//Factory.cpp#include "Factory.h"#include "Product.h"#include <iostream>using namespace std;Factory::Factory(){}Factory::~Factory(){}ConcreteFactory::ConcreteFactory(){ cout<<"ConcreteFactory....."<<endl;}ConcreteFactory::~ConcreteFactory(){}Product* ConcreteFactory::CreateProduct(){ return new ConcreteProduct();}

代碼片斷 5:main.cpp

//main.cpp#include "Factory.h"#include "Product.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){ Factory* fac = new ConcreteFactory(); Product* p = fac->CreateProduct(); return 0;}

代碼說明:示例代碼中給出的是工廠模式解決父類中并不知道具體要實例化哪一個具體的子類的問題,至于為創建對象提供接口問題,可以由工廠中附加相應的創建操作例如Create***Product()即可。具體請參加討論內容。

關于工廠模式的討論

工廠模式在實際開發中應用非常廣泛,面向對象的系統經常面臨著對象創建問題:要創建的類實在是太多了。而工廠提供的創建對象的接口封裝(第一個功能),以及其將類的實例化推遲到子類(第二個功能)都部分地解決了實際問題。一個簡單的例子就是筆者開開發 VisualCMCS 系統的語義分析過程中,由于要為文法中的每個非終結符構造一個類處理,因此這個過程中對象的創建非常多,采用工廠模式后系統可讀性性和維護都變得elegant 許多。

工廠模式也帶來至少以下兩個問題:

  1. 如果為每一個具體的 ConcreteProduct 類的實例化提供一個函數體,那么我們可能不得不在系統中添加了一個方法來處理這個新建的 ConcreteProduct,這樣工廠的接口永遠就不肯能封閉(Close)。當然我們可以通過創建一個工廠的子類來通過多態實現這一點,但是這也是以新建一個類作為代價的。
  2. 在實現中我們可以通過參數化工廠方法,即給 工廠Method()傳遞一個參數用以決定是創建具體哪一個具體的 Product(實際上筆者在 VisualCMCS 中也正是這樣做的)。當然也可以通過模板化避免 1)中的子類創建子類,其方法就是將具體 Product 類作為模板參數,實現起來也很簡單。

可以看出,工廠模式對于對象的創建給予開發人員提供了很好的實現策略,但是工廠模式僅僅局限于一類類(就是說 Product 是一類,有一個共同的基類),如果我們要為不同類的類提供一個對象創建的接口,那就要用 Abstract工廠了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69av成年福利视频| 亚洲xxxx做受欧美| 久久精品国产一区二区三区| 亚洲色图激情小说| 九色精品美女在线| 国产精品偷伦视频免费观看国产| 91国产在线精品| 久久伊人免费视频| 高清日韩电视剧大全免费播放在线观看| 欧美孕妇性xx| 欧美日韩国产精品| 日本欧美黄网站| 亚洲新中文字幕| 91久久久久久久久久久| 国产亚洲aⅴaaaaaa毛片| 欧美精品videosex牲欧美| 精品国产乱码久久久久久虫虫漫画| 久久视频这里只有精品| 91国内免费在线视频| 亚洲人成电影网站色| 国产精品三级在线| 欧美久久精品一级黑人c片| 亚洲第一区第一页| 成人av资源在线播放| 91精品国产综合久久久久久久久| 精品无人国产偷自产在线| 欧美国产日产韩国视频| 欧美成人午夜免费视在线看片| 精品国产区一区二区三区在线观看| 亚洲色图综合久久| 日韩亚洲一区二区| 亚洲天堂成人在线| 深夜精品寂寞黄网站在线观看| 久久精品国产精品亚洲| 国产成人在线亚洲欧美| 狠狠色狠色综合曰曰| 午夜精品久久久久久久久久久久| 欧美日韩xxxxx| 久久91精品国产| 91久久精品国产| 国产精品天天狠天天看| 在线观看中文字幕亚洲| 成人福利网站在线观看11| 久久久久久久国产精品| 欧美xxxwww| 国产日韩欧美视频| 日韩欧美在线视频日韩欧美在线视频| 久久精品中文字幕免费mv| 国产精品免费视频久久久| 日本亚洲精品在线观看| 国产精品久久久久久久久粉嫩av| 日韩成人黄色av| 国产精品福利小视频| 亚洲黄色在线看| 97国产真实伦对白精彩视频8| 亚洲欧洲在线观看| 欧美在线中文字幕| 欧美理论片在线观看| 欧美国产精品人人做人人爱| 色综合伊人色综合网站| 91精品在线国产| 亚洲成人久久久| 中文字幕在线国产精品| 精品久久久久久国产| 国产精品免费视频xxxx| 日本精品久久电影| 91在线精品视频| 亚洲国内高清视频| 色琪琪综合男人的天堂aⅴ视频| 亚洲乱码一区av黑人高潮| 亚洲电影成人av99爱色| 成人免费视频a| 亚洲黄色av女优在线观看| 中文字幕日韩精品在线| 一区二区三区四区精品| 欧美激情久久久久久| 亚洲а∨天堂久久精品喷水| www.日韩系列| 538国产精品一区二区免费视频| 蜜臀久久99精品久久久久久宅男| 亚洲一区二区精品| 欧美一二三视频| 日本一本a高清免费不卡| 国产在线精品自拍| 成人美女av在线直播| 中文字幕视频一区二区在线有码| 欧美黄色免费网站| 欧美裸体视频网站| 成人黄色影片在线| 久久久久久久av| 91干在线观看| 91国自产精品中文字幕亚洲| 欧美肥臀大乳一区二区免费视频| 国产精品扒开腿做爽爽爽男男| 91精品国产91久久久| 国产精品户外野外| 欧美在线视频在线播放完整版免费观看| 亚洲精品电影久久久| 亚洲视频专区在线| 亚洲精品国产精品国产自| 久久大大胆人体| 欧美大尺度在线观看| 中文字幕欧美在线| 欧美性生交xxxxxdddd| 亚洲一区二区三区xxx视频| 波霸ol色综合久久| 成人激情视频小说免费下载| 欧美精品www| 韩国精品久久久999| 97视频在线观看免费高清完整版在线观看| 国产精品色视频| 狠狠色狠狠色综合日日小说| 免费97视频在线精品国自产拍| 欧美激情一级精品国产| 欧美老妇交乱视频| 久久久午夜视频| 欧美巨大黑人极品精男| 欧美中文在线观看国产| 91精品啪aⅴ在线观看国产| 欧美高跟鞋交xxxxhd| 亚洲视频在线观看视频| 综合av色偷偷网| 国产精品吊钟奶在线| 美女撒尿一区二区三区| 亚洲精品久久在线| 性金发美女69hd大尺寸| 成人欧美一区二区三区在线湿哒哒| 欧美一区二区三区图| 欧美性猛交视频| 日韩精品视频在线免费观看| 久久久久中文字幕2018| 91老司机在线| 国产欧美亚洲精品| 欧美一级成年大片在线观看| 欧美高清不卡在线| 精品欧美aⅴ在线网站| 亚洲片在线资源| 欧美黑人一级爽快片淫片高清| 亚洲一区二区三区sesese| 91美女高潮出水| 国产精品91在线观看| 精品国模在线视频| 中文字幕在线国产精品| 亚洲国产小视频在线观看| 亚洲男人的天堂在线播放| 国产精品久久久久不卡| 国产精品欧美一区二区| 亚州精品天堂中文字幕| 日韩成人激情视频| 精品中文字幕久久久久久| 国产精品亚洲自拍| 欧美日韩中国免费专区在线看| 欧美最猛性xxxxx亚洲精品| 成人动漫网站在线观看| 亚洲国产97在线精品一区| 国产日本欧美一区二区三区在线| 91欧美精品成人综合在线观看| 97国产在线观看| 色综合老司机第九色激情| 亚洲一区亚洲二区亚洲三区| 日韩中文在线中文网在线观看| 日韩中文在线中文网在线观看| 精品久久久久久久久久久| 7777kkkk成人观看|