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

设计模式——builder生成器模式

文章目录

  • 引言
  • 代码框架
  • 代码实例
  • 总结

引言

一句话讲清楚 生成器(Builder)模式 —— 让别人帮你做麻烦事。

举个例子:你想吃一份蒜苔炒肉饭。你有两种选择:

  1. 自己买菜、洗菜、炒菜,全程掌控;
  2. 去食堂点一份,让食堂阿姨做好,你只需取餐即可。

很明显,第二种方式更省心。你无需知道食材和做法,只需指定“我要吃什么”。如果明天想换成青椒肉丝,也只要改个菜名即可。这正是 Builder 模式 的精髓所在:

  • 隐藏对象创建的复杂细节,提供统一构建接口;
  • 允许不同的构建者生产不同的产品;
  • 构造步骤产品表示分离,使系统更灵活、可扩展。

在软件中,当我们需要构建“由多个部分组成的复杂对象”时(例如文档、房屋、网络数据包、角色配置等),Builder 模式就像食堂阿姨,帮我们把复杂过程封装起来,只留下一个简单的点单接口。

代码框架

首先来看一个时序图:

  • aClient 就是你
  • aDirector 就是食堂阿姨
  • aConctreteBuilder 就是蒜苔炒肉饭
  1. 你看了看菜单在脑子里产生了吃蒜苔炒肉饭的想法
    • new ConcreteBuilder
  2. 你告诉阿姨,你点蒜苔炒肉饭
    • new Director(a ConcreteBuilder)
  3. 你叫阿姨开始做饭
    • construct()
  4. 取餐
    • getResult()
      在这里插入图片描述
      理解了上面流程,你也就大概清除了builder的编码框架,如下图
      在这里插入图片描述
  • Builder(抽象的做饭流程)
    — 为创建一个 Product 对象的各个部件指定抽象接口。

  • ConcreteBuilder(具体的做饭流程)
    — 实现 Builder 的接口以构造和装配该产品的各个部件。
    — 定义并明确它所创建的表示。
    — 提供一个检索产品的接口(例如 GetASCIIText()GetTextWidget())。

  • Director(食堂阿姨)
    — 构造一个使用 Builder 接口的对象。

  • Product(蒜苔炒肉,青椒炒肉,肉沫茄子…)
    — 表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。
    — 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

代码实例

class ProductA{
public:vector<void*> materials; // 材料public:void addMeat(); // 加肉void addWater(); // 加水void addOil(); // 加油void fireUp(); // 开火...
};class ProductB{
public:vector<void*> materials; // 材料public:// 操作...
};class Builder{
public:virtual void* build() = 0;
};class BuilderA : public Builder{
public:void* build() override{ProductA *A = new ProductA();A->addMeat();A->addOil();A->addWater();A->fireUp();return A;}
};class BuilderB : public Builder{// 与 BuilderA 同理 
};class Director{
private:Builder* builder;
public:Director() = delete; // 显示删除无参构造Director(Builder* _builder) : builder(_builder){}void* construct(){if (!builder)return nullptr;return builder->build();}
};int main(){// 不需要直接使用ProductA进行手动构造,而是将复杂的工作留给builderBuilder* builder = new BuilderA();Director* director = new Director(builder);ProductA* productA = (ProductA*)director->construct();
}

总结

Builder(生成器)模式的核心是将复杂对象的构建过程与其最终表示分离。换句话说,它让“怎么做”和“做成什么样”解耦。

当一个对象的创建步骤非常复杂(例如需要多个阶段、多个组件、甚至不同的构建方式),我们不希望客户端去控制所有细节,而是希望提供一个统一的构建接口(Builder),由指挥者(Director)负责具体的调用顺序,最后生成一个完整的产品(Product)。

http://www.dtcms.com/a/553988.html

相关文章:

  • 政务公开与网站建设工作总结存在问题和困难小程序装修页面设计
  • 厦门网站网站建设php wordpress 模版
  • Python爬虫---中国大学MOOC爬取数据(文中有
  • Nginx 从零到精通 - 最详细的循序渐进教程
  • Rust专项——迭代器高级用法:flat_map、fold、并行迭代与性能优化
  • 阿里云wordpress建站找做网站的公司
  • 做招聘网站赚钱吗用c 做网站
  • kafka添加压缩配置后失败
  • 深入理解网络层:互联网的 “交通指挥中心“ 与核心技术解析
  • webrtc代码走读(十三)-QOS-帧率调控机制
  • 【机器学习10】项目生命周期、偏斜类别评估、决策树
  • Linux驱动开发与Android驱动开发
  • 在Ubuntu云服务器上安装宝塔面板的完整指南
  • 网站的运营维护南京h5网站开发
  • 揭阳高端网站建设价格一起做业官方网站
  • 机器人控制基础:伺服驱动器的泄放电阻
  • 北大上海AiLab具身导航最新基准测试!NavSpace: 导航智能体如何遵循空间智能指令
  • 医械车间安灯呼叫系统如何通过分级通知提升响应效率?
  • Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用
  • JavaScript 数组基础
  • 厦门双瑞高磁网站是谁做的线上设计师网站
  • 电商数据网站有哪些国内外贸网站建设
  • 前端摄像头到远端平台的实现过程
  • C++中堆和栈的概念
  • 东莞网站建设网站建设多少钱html5做网页
  • 【BuildFlow 筑流】PDF 文档结构与图形基础
  • Z400重力仪调平操作指南
  • 【Algorithm】Day-10
  • Algorithm refinement: Mini-batch and Soft Update|算法改进:小批量和软更新
  • 沙坪坝集团网站建设湖南pc网站建设费用