定义与类型
- 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
- 类型:创建型
建造者模式就是如何一步一步构建包含多个组件的对象;相同的构建过程可以创建出不同的产品,比较适用于流程固定但是顺序不一定固定的场景
适用场景
- 如果一个对象有非常复杂的内部结构(很多属性)
- 想把复杂对象的创建和使用进行分离
优点与缺点
优点:
- 封装性好,创建和使用分离
- 扩展性好、建造类之间独立、一定程度上解耦
缺点:
- 产生多余的Builder对象
- 产品内部发生变化,建造者都要进行修改,成本较大(视具体的业务场景而定)
建造者模式与工厂模式的不同
- 建造者模式更注重于方法的调用顺序
而工厂模式注重于创建产品,创建对象的粒度不同 - 建造者模式可以创建一些复杂的产品,由各种复杂的部件所组成
而工厂模式创建出来的都是一个样的 - 工厂模式只要把这个对象创建出来就OK了
而建造者模式不止要创建出这个产品,还要知道这个产品有哪些部件组成的
创建一个对象需要很多步骤的时候,就可以使用建造者模式;当创建一个对象只需要一个简单的方法就可以创建整个对象时,就适合使用工厂相关的模式
coding
业务场景:需要去构建的课程
v1.0
代码见:builder
v1.0版本:讲师、课程教练、老板三个角色;课程教练负责下达课程命令与收集讲师所提交上来的各种材料从而组织成一门完整的课程然后反馈给老板
UML类图:
可以有很多的Builder,每个Builder的特点都不一样,比如后端课程的builder、前端课程的builder;我们可以根据实际课程的不同,在应用层选择不同的builder然后传给对应的课程教练,教练拿到应用层所传的具体builder之后来创建整个课程
v2.0
Coach类并不一定要有,进行版本演进:
这种建造者模式使用的非常广,把具体的实体类和具体实体类的builder创建在一个类当中
以后的维护也会比较方便
代码见:builder v2
最终在应用层采用了链式调用,我们可以按需调用
UML类图:
应用层只需要控制和具体的builder进行交互,然后设置具体的属性,最后调用build方法,返回具体的实体类就行了
jdk源码解析
StringBuilder与StringBuffer是jdk中非常标准的建造者模式
以StringBuilder的append方法为例:
最终的返回对象都是自身,之后也可以使用链式调用的方式进行写代码
注意:StringBuffer的append方法都加了synchronized修饰