当前位置: 首页 > news >正文

C++设计模式_创建型模式_建造者模式Builder

本篇文章记录建造者模式。

建造者模式定义

建造者模式,也称为构建器模式,构建者模式,属于创建型模式。引入建造者(Builder)模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
通常用于创建比较复杂的对象,继续使用三个怪物类的示例说明构建者模式。

一个具体实现范例的逐步重构

还是三个怪物:亡灵类,元素类,机械类
怪物组成:头部,躯干(颈部,尾巴),肢体 三个部位组成
编码步骤:将怪物躯干部模型信息读入内存,将怪物的头部和四肢模型信息读入内存;
下面的方式类似于最初的模板方法模式。
loadTrunk(string strno) ,loadHead(string strno) ,loadLibs(string strno) 称为构建过程相关的函数。
引入与怪物类同层次的相关构建器类,把怪物类中代码搬到相关的构建器类中。

/*怪物类组成:头部,躯干,肢体 三部分组成。
*/
// loadTrunk    loadHead    loadLibs
class CMonster
{
public:// 组装怪物void setUp(string_view strmode){loadTrunk(strmode.substr(1,2));loadHead(strmode.substr(3, 2));loadLibs(strmode.substr(5, 2));}virtual void loadTrunk(string_view str) = 0;virtual void loadHead(string_view str) = 0;virtual void loadLibs(string_view str) = 0;
};// 创建三个怪物
class CUndead : public CMonster
{
public:virtual void loadTrunk(string_view str) override{cout << "组装 亡灵类躯干   " << str << endl;}virtual void loadHead(string_view str) override{cout << "组装 亡灵类头部   " << str << endl;}virtual void loadLibs(string_view str) override{cout << "组装 亡灵类四肢   " << str << endl;}
};class CElement : public CMonster
{
public:virtual void loadTrunk(string_view str) override{cout << "组装 元素类  躯干 " << str << endl;}virtual void loadHead(string_view str) override{cout << "组装 元素类 头部  " << str << endl;}virtual void loadLibs(string_view str) override{cout << "组装 元素类  四肢 " << str << endl;}
};class CMechanic : public CMonster
{
public:virtual void loadTrunk(string_view str) override{cout << "组装 机械类躯干   " << str << endl;}virtual void loadHead(string_view str) override{cout << "组装 机械类头部   " << str << endl;}virtual void loadLibs(string_view str) override{cout << "组装 机械类四肢   " << str << endl;}
};void test()
{CMonster* pbase = new CMechanic();pbase->setUp("22558899");/*组装 机械类躯干   25组装 机械类头部   58组装 机械类四肢   89*/
}

使用string.substr(index,N)对字符串进行了切割。
使用string_view来代替字符串,提高的效率。

引入建造者(Builder)模式

引入建造者(Builder)模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
CMonsterBuilder类就是对象的构建,CMonster类是对象的表示, CMonsterBuilder类种包含了CMonster类。

namespace _nmsp2
{class CMonster{public:virtual ~CMonster(){}};class CUndead : public  CMonster{public:};class CElement : public  CMonster{public:};class CMechanic : public  CMonster{public:};// 怪物类构建器 父类class CMonsterBuilder{public:virtual ~CMonsterBuilder(){}CMonster* getpMonster(){return pbase;}virtual void loadTrunk(string strno) = 0;virtual void loadHead(string strno) = 0;virtual void loadLibs(string strno) = 0;// protected:CMonster* pbase;};// 亡灵类构建器class CUndeadBuilder : public CMonsterBuilder{public:CUndeadBuilder() //构造函数:在怪物类的构建器的构造函数中new 对应类{pbase = new CUndead();}virtual void loadTrunk(string strno){cout << "组装 亡灵类 躯干" << endl;}virtual void loadHead(string strno){cout << "组装 亡灵类 头部" << endl;}virtual void loadLibs(string strno){cout << "组装 亡灵类 四肢" << endl;}};class CElementBuild : public CMonsterBuilder{public:CElementBuild(){pbase = new CElement();}virtual void loadTrunk(string strno){cout << "组装元素类躯干" << endl;}virtual void loadHead(string strno){cout << "组装 元素类 头部" << endl;}virtual void loadLibs(string strno){cout << "组装 元素类 四肢" << endl;}};class CMeChanicBuild : public CMonsterBuilder{public:CMeChanicBuild(){pbase = new CMechanic();}virtual void loadTrunk(string strno){cout << "组装 机械类 躯干" << endl;}virtual void loadHead(string strno){cout << "组装 机械类 头部" << endl;}virtual void loadLibs(string strno){cout << "组装 机械类 四肢" << endl;}};// 指挥者类class CMonsterDirector{public:CMonsterDirector(CMonsterBuilder* pbuild){pdirector = pbuild;}// 指定新的构建器 void SetBuilder(CMonsterBuilder* ptmpBuilder){pdirector = ptmpBuilder;}CMonster* construct(string strmodelno){pdirector->loadTrunk(strmodelno.substr(4, 3));	// 截取躯干部分字符串,表示躯干的编号;pdirector->loadHead(strmodelno.substr(7, 3));	// 截取 头部pdirector->loadLibs(strmodelno.substr(10, 3)); // 截取四肢return pdirector->getpMonster();}private:CMonsterBuilder* pdirector;};void test(){_nmsp2::CMonsterBuilder* pmb = new _nmsp2::CUndeadBuilder();_nmsp2::CMonsterDirector* pDirect = new _nmsp2::CMonsterDirector(pmb);_nmsp2::CMonster* pCMonster = pDirect->construct("2222222233333333334444444");/*组装 亡灵类 躯干组装 亡灵类 头部组装 亡灵类 四肢*/}
}

构造者模式四种角色

构造者模式包含的四种角色:
1 Builder 抽象构建器,这里指CMonsterBuilder
2 具体构建器:CUndeadBuilder, CElementBuilder, CMechanicBuilder,
3 产品:这里指:CUndead, CElement, CMechanic
4 指挥者Director: CMonsterDirector

构造者模式结构

在这里插入图片描述关系梳理:各个怪物与怪物构造者之间是组合关系;构造者被指挥者指挥,他们之间是聚合关系。


文章转载自:

http://hBNDWZpj.ydytt.cn
http://CJ52U1l0.ydytt.cn
http://qcJWxjtG.ydytt.cn
http://VvfWiiMp.ydytt.cn
http://B9dCXoad.ydytt.cn
http://Zn4K2UkI.ydytt.cn
http://BlSAHo2q.ydytt.cn
http://gn01ecQr.ydytt.cn
http://ODnf80Su.ydytt.cn
http://4y33mssj.ydytt.cn
http://GAeO4EJq.ydytt.cn
http://eE83GCTg.ydytt.cn
http://PdtXVmy0.ydytt.cn
http://QBRxAEOE.ydytt.cn
http://OUAJq6N2.ydytt.cn
http://IOHOPEvK.ydytt.cn
http://wvSRcvOU.ydytt.cn
http://EBrpoMhJ.ydytt.cn
http://LWGqenYX.ydytt.cn
http://ExTrQQOk.ydytt.cn
http://ONrcO4Yb.ydytt.cn
http://eA6bgcB5.ydytt.cn
http://ramUK2qJ.ydytt.cn
http://hAI0Qocw.ydytt.cn
http://x3KWERgl.ydytt.cn
http://r5x4npfC.ydytt.cn
http://WNJqMccQ.ydytt.cn
http://aiAgPlNH.ydytt.cn
http://GpSK6ojP.ydytt.cn
http://aB7A8KHu.ydytt.cn
http://www.dtcms.com/a/386228.html

相关文章:

  • Dell PowerEdge R620 服务器内存和硬盘罢工了
  • 儿童无屏幕对讲机 Bunny 融资百万美元;腾讯会议推出 AI 托管:先行听会、代听多会、全程记录丨日报
  • linux系统命令学习
  • Java 大视界 -- 基于 Java 的大数据可视化在企业供应链风险管理与应急响应中的应用(412)
  • 【C++游记】Map与Set的封装
  • Infoseek舆情监测系统:AI驱动的一站式舆情管理解决方案
  • IDEA 连接MySQL数据库
  • Electron的IPC通讯 send/on 和 invoke/handle 的区别
  • 扩展开发:创建 Electron 插件
  • windows下ffmpeg的编译安装(支持硬件加速)--2025最新
  • JAVA后端面试笔记(二)
  • 每日前端宝藏库 | fullPage.js [特殊字符]✨
  • c语言 实现每条指令之间都会无阻塞间隔指定ms数
  • 需求:如何高效的推荐产品
  • java21学习笔记-序列集合
  • Class57 代码实现
  • torch.gather
  • 自学嵌入式第四十二天:单片机-定时器和UART串口
  • 大数据毕业设计选题推荐-基于大数据的旅游网站用户行为数据分析系统-Hadoop-Spark-数据可视化-BigData
  • 深入浅出数据结构:队列(Queue)—— 生活中的排队艺术
  • spring通过Spring Integration实现udp通信
  • Linux内存管理章节十八:内核开发者的武器库:内存分配API实战指南
  • CAD如何输出PDF多页文件
  • 我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi
  • 1.整流-滤波电路的缺点和PFC的引入
  • QT 项目 线程信号切换 举例
  • 构网型5MW中压储能变流升压一体机技术方案
  • 【数据工程】8. SQL 入门教程
  • C++---前向声明
  • 在Qt项目中使用QtConcurrent::run,实现异步等待和同步调用