设计模式-抽象工厂模式
定义
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
实现

步骤一:
创建抽象类来获取工厂。
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);
}




