
6.5 建造者模式重构代码
在软件系统开发中,有时会面临一个复杂对象的创建工作,其通常由各个部分的子对象用一定过程构建出来,随着需求的迭代,这个复杂对象的各个部分经常面临重大的变化,但是将它们组合在一起的过程却相对稳定,这种场景就适合用建造者模式。
这里会把构建的过程交给创建者类,而创建者通过使用构建工具包构建出不同的装修套餐。
6.5.1 工程结构

建造者模式代码类关系如图6-3所示。

图6-3
建造者模式代码工程有三个核心类,这三个核心类是建造者模式的具体实现。与使用if…else判断方式实现逻辑相比,它额外新增了两个类,具体功能如下:
·Builder:建造者类具体的各种组装,都由此类实现。
·DecorationPackageMenu:是IMenu接口的实现类,主要承载建造过程中的填充器,相当于一套承载物料和创建者中间衔接的内容。
也可以从装修材料参考图的视角看待这类工程,更便于理解,如图6-4所示。

图6-4
接下来分别介绍几个类的功能的具体实现方式。
6.5.2 定义装修包接口

接口类定义了填充吊顶、涂料、地板、地砖各种材料的方法,以及最终提供获取全部明细的方法。
6.5.3 实现装修包接口



在装修包的实现中,每一种方法都返回了this对象本身,可以非常方便地用于连续填充各种物料。同时,在填充时也会根据物料计算相应面积的报价,吊顶和涂料按照面积乘以单价计算。最后,同样提供了统一的获取装修清单的明细方法。
6.5.4 建造者类创建

最后,在建造者的使用中就已经非常容易了。统一的建造方式通过不同物料填充出不同的装修风格:豪华欧式、轻奢田园和现代简约。如果公司扩展业务,也可以将这部分内容配置到数据库中自动生成,但整体过程仍然可以使用建造者模式的思想进行搭建。
6.5.5 测试验证
1.单元测试


在单元测试中,使用建造者模式分别创建出三种装修套餐的价格,获取详情信息并进行输出。
·levelOne、levelTwo、levelThree 对应三种装修风格:豪华欧式、轻奢田园和现代简约。
·入参的信息是房屋面积,最终获取装修报价单。实际的业务场景会更复杂,这里的案例主要展示最核心的逻辑。
2.测试结果

