工厂设计模式和抽象工厂设计模式
生活随笔
收集整理的這篇文章主要介紹了
工厂设计模式和抽象工厂设计模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
工廠設計模式
1、定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使得一個類的實例化延遲到子類。 ——《設計模式》GoF
2、代碼實現(xiàn)
代碼背景:實現(xiàn)一個導出數(shù)據(jù)的接口,讓客戶選擇數(shù)據(jù)的導出方式
#include <string> // 實現(xiàn)導出數(shù)據(jù)的接口, 導出數(shù)據(jù)的格式包含 xml,json,文本格式txt 后面可能擴展excel格式csv class IExport { public:virtual bool Export(const std::string &data) = 0;virtual ~IExport(){} };class ExportXml : public IExport { public:virtual bool Export(const std::string &data) {//...//Xml方式輸出return true;} };class ExportJson : public IExport { public:virtual bool Export(const std::string &data) {//...//Json方式輸出return true;} };class ExportTxt : public IExport { public:virtual bool Export(const std::string &data) {//...//Txt方式輸出return true;} };//==========================================上面是干活的類,下面是對應的工廠類==================================================class IExportFactory { public:IExportFactory() {_export = nullptr;}virtual ~IExportFactory() {if (_export) {delete _export;_export = nullptr;}}//調(diào)用對象自己的的Export函數(shù)bool Export(const std::string &data) {if (_export == nullptr) {_export = NewExport();}return _export->Export(data);} protected:virtual IExport * NewExport(/* ... */) = 0; //工廠模式的優(yōu)點是隱藏了創(chuàng)建對象時的復雜過程,而外界直接用創(chuàng)建好的對象就可以了 private:IExport* _export; };class ExportXmlFactory : public IExportFactory { protected:virtual IExport * NewExport(/* ... */) { // 可能有其它操作,或者許多參數(shù)IExport * temp = new ExportXml();// 可能之后有什么操作return temp;} }; class ExportJsonFactory : public IExportFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IExport * temp = new ExportJson;// 可能之后有什么操作return temp;} }; class ExportTxtFactory : public IExportFactory { protected:IExport * NewExport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IExport * temp = new ExportTxt;// 可能之后有什么操作return temp;} };int main () {IExportFactory * Txt_factory = new ExportTxtFactory();Txt_factory->Export("hello world");return 0; }代碼分析:
- 首先創(chuàng)建一個抽象接口類,規(guī)范代碼;所有新擴展的接口輸出類都繼承這個接口,并實現(xiàn)如何輸出數(shù)據(jù)的功能
- 創(chuàng)建一個總的抽象工廠類,再創(chuàng)建接口輸出類對應的工廠類,并繼承這個抽象工廠類
- 每個接口輸出方式對應的工廠類中:實現(xiàn)接口輸出類的創(chuàng)建過程,因為創(chuàng)建對象過程比較復雜,就交給工廠創(chuàng)建(工廠就是用來創(chuàng)建對象的)
- 創(chuàng)建出來的對象可以選擇返回給用戶,也可以選擇調(diào)用這個對象里面的函數(shù)完成特定的功能
總結:工廠就是用來創(chuàng)建對象的,尤其是創(chuàng)建需要很多初始化參數(shù)的對象,讓外界不用關心創(chuàng)建過程只關心使用
3、要點
-
解決創(chuàng)建過程比較復雜,希望對外隱藏這些細節(jié)的場景
- 比如連接池、線程池
-
隱藏對象真實類型(用到了多態(tài))
-
對象創(chuàng)建會有很多參數(shù)來決定如何創(chuàng)建,而工廠就干了這個活,外界直接用創(chuàng)建好的對象就可以了
4、本質(zhì)
- 延遲到子類來選擇實現(xiàn)---->子類指的是工廠子類,想得到什么對象,只要創(chuàng)建對應的工廠類對象就能得到想要的對象
5、結構圖
抽象工廠設計模式
1、定義
提供一個接口,讓該接口負責創(chuàng)建一系列“相關或者相互依賴的對象”,無需指定它們具體的類。——《設計模式》GoF
2、代碼實現(xiàn)
代碼背景:實現(xiàn)一個擁有導出導入數(shù)據(jù)的接口,讓客戶選擇數(shù)據(jù)的導出導入方式;
#include <string> // 實現(xiàn)導入、導出數(shù)據(jù)的接口,導入、導出數(shù)據(jù)的格式包含 xml,json,文本格式txt 后面可能擴展excel格式csv class IExport { public:virtual bool Export(const std::string &data) = 0;virtual ~IExport(){} };class ExportXml : public IExport { public:virtual bool Export(const std::string &data) {return true;} };class ExportJson : public IExport { public:virtual bool Export(const std::string &data) {return true;} };class ExportTxt : public IExport { public:virtual bool Export(const std::string &data) {return true;} };//==========================================上面是導出==================================================class IImport { public:virtual bool Import(const std::string &data) = 0;virtual ~IImport(){} };class ImportXml : public IImport { public:virtual bool Import(const std::string &data) {return true;} };class ImportJson : public IImport { public:virtual bool Import(const std::string &data) {return true;} };class ImportTxt : public IImport { public:virtual bool Import(const std::string &data) {return true;} };//==========================================上面是導入==================================================class IDataApiFactory { public:IDataApiFactory() {_export = nullptr;_import = nullptr;}virtual ~IDataApiFactory() {if (_export) {delete _export;_export = nullptr;}if (_import) {delete _import;_import = nullptr;}}bool Export(const std::string &data) {if (_export == nullptr) {_export = NewExport(); //當子類重寫了NewExport,調(diào)用的就是子類的了}return _export->Export(data);}bool Import(const std::string &data) {if (_import == nullptr) {_import = NewImport(); //當子類重寫了NewExport,調(diào)用的就是子類的了}return _import->Import(data);} protected:virtual IExport * NewExport(/* ... */) = 0;virtual IImport * NewImport(/* ... */) = 0; private:IExport *_export;IImport *_import; };class XmlApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IExport * temp = new ExportXml;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IImport * temp = new ImportXml;// 可能之后有什么操作return temp;} };class JsonApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IExport * temp = new ExportJson;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IImport * temp = new ImportJson;// 可能之后有什么操作return temp;} }; class TxtApiFactory : public IDataApiFactory { protected:virtual IExport * NewExport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IExport * temp = new ExportTxt;// 可能之后有什么操作return temp;}virtual IImport * NewImport(/* ... */) {// 可能有其它操作,或者許多參數(shù)IImport * temp = new ImportTxt;// 可能之后有什么操作return temp;} };int main () {IDataApiFactory *factory = new TxtApiFactory();factory->Import("hello world");factory->Export("hello world");return 0; }代碼分析:
- 和普通的工廠類不同的是一個工廠類既可以創(chuàng)建對應的導出對象,也能創(chuàng)建導入對象
- 抽象工廠設計模式:讓有關聯(lián)的類可以放在一個工廠類中,需要的時候就可以創(chuàng)建對應的對象
- 在本例中,Txt方式的導入、導出是兩個功能,但是都是和Txt相關的
- 可以把和Txt功能相關的類都放進Txt工廠中,需要某個Txt功能的時候,就調(diào)用相關的函數(shù)創(chuàng)建對象就行
- 根據(jù)具體業(yè)務需求,可以創(chuàng)建完返回該對象,也可以直接調(diào)用該對象的成員函數(shù)實現(xiàn)某些功能
總結:抽象工廠設計模式的擴展性更強,可用于擴展同一類型下的多種功能(例:Txt方式的導入、導出、轉碼等)
3、結構圖
總結
以上是生活随笔為你收集整理的工厂设计模式和抽象工厂设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php实现解析二维码内容
- 下一篇: 基于ASP.NET技术的企业办公自动化系