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