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

一、驱动力:

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

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

使用构造函数(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,......} 这种写法。

相关推荐
一隅论数智2 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
深圳老胡2 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
彧azz2 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
陈卫军老师2 天前
陈卫军:把口味写在一张纸上,店才稳得住
经验分享·笔记·流量运营
`流年づ2 天前
人工智能学习笔记 - 补充
人工智能·笔记·深度学习·学习
qeen872 天前
【Linux】操作系统之进程介绍(二)
linux·笔记·学习·进程
从零开始的嵌入式之旅2 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
陈年老古董2 天前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
彧azz2 天前
操作系统时间管理与系统核心板块学习总结
c语言·笔记·学习·系统架构