设计模式 - 建造者模式 笔记

一、驱动力:

构建复杂对象(属性多、可选参数多)时,用构造函数构建会导致敲码 易出错、可读性不高、等。 由此引入建造者模式来改善问题。

建造者模式可看作 构造函数的 补充方案:

使用构造函数(new)构建对象是面对绝大多数对象的最基础、最通用的方案。一旦对象复杂了(参数多、可选、最好分步创建的),构造函数就不够用了,这时候建造者模式作为它的补充方案上场。

**归纳:**相比构造函数:

① 可读性更高

② 改进可选参数的配置不灵活问题

③ 拆分臃肿的构造函数为清晰的构建步骤


二、举例:

一个电脑对象,包含属性:(CPU、显卡、内存、硬盘、电源、显示器、键盘、鼠标、机箱、喇叭 ......)等等,很多属性(例如:喇叭、显示器等)可以不要。

  1. 如果使用构造函数:

    new Computer("i9", "3090", "16G", "1T", Null , "黑色", "500W" , Null ......);

会带来几个问题:

① 参数十几个,顺序不能错,传错一个出 bug。

② 读代码时,一眼看去,哪个是内存 、哪个是硬盘

③ 有的电脑不要喇叭、有的不要显示器。

是约定好让不要就传Null,还是说让一些参数默认 = null ,还是说重载多个构造函数?


  1. 建造者怎么解决?

引入一个电脑建造者(ComputerBuilder),指挥它干活(建造我想要的对象):

复制代码
Computer pc = new ComputerBuilder()
    .cpu("i9")
    .gpu("3090")
    .ram("16G")
    .build();

带来好处:

① 代码一眼清晰明了、不要的参数就不要,不用传null什么的

② 将原本堆积到构造函数中的所有逻辑代码拆分了一下,更简单、灵活,build() 时可统一校验一下传入的对象是否都合法兼容。


三、其他要点:

1、 建造者模式------天然适合 「固定步骤、顺序不能乱、分步组装」 的对象:

例如造房子的4 步:① 打地基 ② 砌墙 ③封顶 ④装修

(必须先打地基 → 再砌墙 → 再封顶 → 最后装修)这时候可以有一个指挥者来固定一套 "组装步骤顺序",让建造者照着顺序干活。

2、建造者模式------核心思想:将复杂对象的 构建过程 表示(最终成品)分离,用相同的构建步骤,生成不同的对象

如何理解?

拆开翻译:

1. 构建过程 = 制作步骤

比如造房子固定就这4 步

  1. 打地基
  2. 砌墙
  3. 封顶
  4. 装修

这就是构建过程 步骤永远不变。

2. 表示(最终成品)= 造出来的东西

例如:

  • 普通平房
  • 豪华别墅
  • 高楼大厦

这就是不同的成品( 同样 4 步,传入参数不同,可以造出不同的房子**)。**

3. 分离

意思就是: 步骤是步骤,房子是房子 我只管按固定 4 步盖 至于盖出来是平房还是别墅,互不干扰。

3、为什么不直接new出对象,并依次 属性赋值?

因为这样对象就是可变的了! new 出来后,你可以修改,别人也可以随便改(线程不安全、容易被篡改。)

当然如果是单线程的、可忽略安全性项目,也可以如此。

C# 有 new 对象(){属性A = xxx , 属性B = xxx,......} 这种写法。

相关推荐
咖啡八杯12 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
亦暖筑序2 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
RainCity2 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
青禾网络4 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO5 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯5 天前
GoF设计模式——命令模式
java·设计模式·架构
花椒技术6 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
艺艺生辉6 天前
迭代器模式-"我也想被增强for循环"
设计模式