一、驱动力:
构建复杂对象(属性多、可选参数多)时,用构造函数构建会导致敲码 易出错、可读性不高、等。 由此引入建造者模式来改善问题。
建造者模式可看作 构造函数的 补充方案:
使用构造函数(new)构建对象是面对绝大多数对象的最基础、最通用的方案。一旦对象复杂了(参数多、可选、最好分步创建的),构造函数就不够用了,这时候建造者模式作为它的补充方案上场。
**归纳:**相比构造函数:
① 可读性更高
② 改进可选参数的配置不灵活问题
③ 拆分臃肿的构造函数为清晰的构建步骤
二、举例:
一个电脑对象,包含属性:(CPU、显卡、内存、硬盘、电源、显示器、键盘、鼠标、机箱、喇叭 ......)等等,很多属性(例如:喇叭、显示器等)可以不要。
如果使用构造函数:
new Computer("i9", "3090", "16G", "1T", Null , "黑色", "500W" , Null ......);
会带来几个问题:
① 参数十几个,顺序不能错,传错一个出 bug。
② 读代码时,一眼看去,哪个是内存 、哪个是硬盘?
③ 有的电脑不要喇叭、有的不要显示器。
是约定好让不要就传Null,还是说让一些参数默认 = null ,还是说重载多个构造函数?
- 建造者怎么解决?
引入一个电脑建造者(ComputerBuilder),指挥它干活(建造我想要的对象):
Computer pc = new ComputerBuilder() .cpu("i9") .gpu("3090") .ram("16G") .build();带来好处:
① 代码一眼清晰明了、不要的参数就不要,不用传null什么的
② 将原本堆积到构造函数中的所有逻辑代码拆分了一下,更简单、灵活,build() 时可统一校验一下传入的对象是否都合法兼容。
三、其他要点:
1、 建造者模式------天然适合 「固定步骤、顺序不能乱、分步组装」 的对象:
例如造房子的4 步:① 打地基 ② 砌墙 ③封顶 ④装修
(必须先打地基 → 再砌墙 → 再封顶 → 最后装修)这时候可以有一个指挥者来固定一套 "组装步骤顺序",让建造者照着顺序干活。
2、建造者模式------核心思想:将复杂对象的 构建过程与 表示(最终成品)分离,用相同的构建步骤,生成不同的对象。
如何理解?
拆开翻译:
1. 构建过程 = 制作步骤
比如造房子固定就这4 步:
- 打地基
- 砌墙
- 封顶
- 装修
这就是构建过程 步骤永远不变。
2. 表示(最终成品)= 造出来的东西
例如:
- 普通平房
- 豪华别墅
- 高楼大厦
这就是不同的成品( 同样 4 步,传入参数不同,可以造出不同的房子**)。**
3. 分离
意思就是: 步骤是步骤,房子是房子 我只管按固定 4 步盖 至于盖出来是平房还是别墅,互不干扰。
3、为什么不直接new出对象,并依次 属性赋值?
因为这样对象就是可变的了! new 出来后,你可以修改,别人也可以随便改(线程不安全、容易被篡改。)
当然如果是单线程的、可忽略安全性项目,也可以如此。
C# 有 new 对象(){属性A = xxx , 属性B = xxx,......} 这种写法。