设计模式-抽象工厂模式
定义
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
实现
![](https://liyanliangpublic.oss-cn-hongkong.aliyuncs.com/img/20210507144606.png)
步骤一:
创建抽象类来获取工厂。
class CAbstractFactory { public: CAbstractFactory(void){}; virtual ~CAbstractFactory(void){}; public: virtual CBuildTotalBase* Creat(CNSDocBase* pDoc, EN_DGN_CODE enDgnCode) = 0; };
步骤二:
工厂A。
class CTotalDesignFactory : public CAbstractFactory { public: CTotalDesignFactory(void){}; ~CTotalDesignFactory(void){}; public: virtual CBuildTotalBase* Creat(CNSDocBase* pDoc, EN_DGN_CODE enDgnCode) { CNSReportCtrl* pReportCtrl = pDoc->GetReportCtrl(); CBuildTotalDesignBase* pBuildMRDataCtrl = nullptr; switch (enDgnCode) { case EN_DGN_CODE_RC_JTG_D62_04: pBuildMRDataCtrl = new CBuildTotalDesign_JTG04(pDoc,pReportCtrl); break; case EN_DGN_CODE_RC_JTG33622018: pBuildMRDataCtrl = new CBuildTotalDesign_JTG33622018(pDoc,pReportCtrl); break; case EN_DGN_CODE_STEEL_JTG_D64_15: pBuildMRDataCtrl = new CBuildTotalDesign_JTG6415(pDoc,pReportCtrl); break; default: ASSERT(0); break; } return pBuildMRDataCtrl; } };
工厂B。
class CTotalAssessFactory : public CAbstractFactory { public: CTotalAssessFactory(void){}; ~CTotalAssessFactory(void){}; public: virtual CBuildTotalBase* Creat(CNSDocBase* pDoc, EN_DGN_CODE enDgnCode) { CNSReportCtrl* pReportCtrl = pDoc->GetReportCtrl(); CBuildTotalAssessBase* pBuildMRDataCtrl = nullptr; switch (enDgnCode) { case EN_DGN_CODE_RC_JTG_D62_04: pBuildMRDataCtrl = new CBuildTotalAssess_JTG04(pDoc,pReportCtrl); break; case EN_DGN_CODE_RC_JTG33622018: pBuildMRDataCtrl = new CBuildTotalAssess_JTG33622018(pDoc,pReportCtrl); break; case EN_DGN_CODE_STEEL_JTG_D64_15: pBuildMRDataCtrl = new CBuildTotalAssess_JTGD6415(pDoc,pReportCtrl); break; default: ASSERT(0); break; } return pBuildMRDataCtrl; } };
步骤三:
工厂生成器。
class CFactoryProducer { public: CFactoryProducer(void){}; ~CFactoryProducer(void){}; public: static CBuildTotalBase* Creat(CNSDocBase* pDoc) { EN_CALC_TYPE enModType = INSDgnCodeCtrl::Instance()->GetCurrentCalcType(pDoc); EN_DGN_CODE enDgnCode = INSDgnCodeCtrl::Instance()->GetCurrentDgnCode(pDoc); CAbstractFactory* pAbstractFactory = nullptr; switch (enModType) { case EN_CALC_DESIGN: pAbstractFactory = new CTotalDesignFactory(); break; case EN_CALC_ASSESS: pAbstractFactory = new CTotalAssessFactory(); break; default: ASSERT(0); break; } if (pAbstractFactory == nullptr) { return nullptr; } return pAbstractFactory->Creat(pDoc,enDgnCode); } };
步骤四:
使用。
CTotalReportService::CTotalReportService(CNSDocBase* pDoc) { m_pBuildMRDataCtrl = CFactoryProducer::Creat(pDoc); ASSERT(m_pBuildMRDataCtrl); }