Skip to content
  • 首页
  • 留言
  • 关于

Share the joys of programming and technology

设计模式-抽象工厂模式

设计模式-抽象工厂模式

2021年5月7日 liyanliang Comments 0 Comment
阅读次数: 95

定义

抽象工厂模式(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);
}

相关文章

  • Civil Designer开发-公路桥梁承载能力检算评定Civil Designer开发-公路桥梁承载能力检算评定
  • 通过Spy++抓取窗口以查询对话框id通过Spy++抓取窗口以查询对话框id
  • IBL计算总结IBL计算总结
  • Midas XD-选筋助手开发Midas XD-选筋助手开发
  • 创建模态对话框绘制直线-ObjectARX开发视频创建模态对话框绘制直线-ObjectARX开发视频
  • 去除重叠的闭合区域去除重叠的闭合区域

C++
设计模式

Post navigation

PREVIOUS
调用另外一个项目中的函数-设计模式解耦
NEXT
土木想往土木软件开发方向发展,应该如何准备

发表回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

近期文章

  • Games101和Games202脑图汇总
  • LearnOpenGL脑图汇总
  • IBL计算总结
  • C++实现一个简单的语言解释器
  • OpenGL-法线贴图(Normal Mapping)
  • OpenGL-卡通着色(Cartoon)
  • OpenGL几何着色器实现贝塞尔曲线
  • WinDbg检查内存泄漏
  • OpenGL雾化效果实现-每像素雾化
  • OpenGL实现billboard效果(CPU)
  • 算法:寻找异常数字
  • OpenGL 几何着色器的应用
  • Midas XD-构件详图开发
  • Midas XD-选筋助手开发
  • Civil Designer开发-检测规范自动生成控制截面
  • Civil Designer开发-公路桥梁承载能力检算评定
  • Midas W-满堂支架快速建模助手开发
  • OpenGL绘制桥梁模型
  • Modern OpenGL绘制圆柱体
  • WordPress分页插件 – WP-PageNavi的使用(替换现有脚本)

全站热点

  • C++编写的情人节小程序 (1,540)
  • Modern OpenGL绘制圆柱体 (759)
  • 提取最小封闭区域 (714)
  • 截面特性计算程序-附源码 (569)
  • 判断一个点是否在闭合区域内 (565)
  • OpenGL开发环境搭建-GLFW与GLAD配置 超详细 (503)
  • OpenGL绘制旋转立方体 (462)
  • Midas XD [错误] 右侧挡土墙的最下端深度必须小于地基的最下端深度 (438)
  • WordPress分页插件 – WP-PageNavi的使用(替换现有脚本) (395)
  • 使用ODA数据库出现 “ODA_ASSUME”: 找不到标识符的错误 (364)
  • 土木想往土木软件开发方向发展,应该如何准备 (361)
  • #pragma message 编译时提示信息 (336)
  • 从DLL中动态加载一个函数:LoadLibrary和GetProcAddress的使用 (331)
  • Midas W-满堂支架快速建模助手开发 (326)
  • midas XD2020的开发 (324)
  • 两跨连续梁影响线绘制-附源码 (320)
  • 算法:寻找异常数字 (260)
  • OpenGL几何着色器实现贝塞尔曲线 (200)
  • OpenGL实现billboard效果(CPU) (196)
  • 通过Spy++抓取窗口以查询对话框id (189)

分类

  • C# (3)
  • C++ (17)
  • MFC (3)
  • ObjectARX (2)
  • OpenGL (11)
  • Revit开发 (1)
  • 学习笔记 (2)
  • 岩土 (2)
  • 算法 (1)
  • 结构设计 (7)
  • 职场生涯 (1)
  • 计算几何 (3)

归档

  • 2023年3月 (2)
  • 2022年10月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (5)
  • 2021年11月 (7)
  • 2021年6月 (3)
  • 2021年5月 (2)
  • 2021年3月 (2)
  • 2021年2月 (8)
  • 2021年1月 (18)

标签

Bezier Curves BillBoard C++ CDN CivilDesigner DLL EasyX fog MFC Midas W Midas XD NormalMapping ObjectARX ODA OpenGL OpenXML Open XML PBR revit WinDbg 基坑设计 影响线 截面特性 桥梁 桥梁检测 桥梁设计 算法 计算几何 设计模式

书签

  • 李燕良的CSDN
  • 崔济东的博客
  • C++爱好者博客
  • 陈学伟的博客
  • 贾苏的博客
  • 陈睦锋的博客
  • 孙勇的博客

统计

  • 0
  • 23
  • 10
  • 73
  • 29
  • 77,669
  • 24,003

实时访问地域

© 2023   liyanliang.net Copyright. All Rights Reserved.