设计模式——Builder

作为不太明白的模式之一,对Builder模式一直没有形成清晰的概念,主要在于:

1、Builder不常用,个人认为流行的builder构造(类似https://blog.****.net/qq_33487412/article/details/78960785,这篇文章举例)不是Builder模式;

2、之前对GOF书籍中的Builder模式理解不够深入,一直使用Java开发,GOF中使用C++和Smalltalk中的例子不喜欢看。

今天看了这篇文章(深入理解Builder模式),增加了不少对Builder模式的理解

模式理解

模式结构

设计模式——Builder

 与客户协作

设计模式——Builder

 适用性

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;

2、当构造过程必须允许被构造的对象有不同的表示时。

当理解了第一条适用情况时,也就理解了第二条;

第一条中有三个概念(个人感觉看与客户的协作图,更加容易理解Builder模式,实际上Builder模式的关键在于协作图中的Director):

“创建复杂对象的算法”,协作图中,aDirector对aConcreteBuilder的调用“BuildPartA()”、“BuildPartB()”、“BuildPartC()”和他们的顺序,就是创建算法;增加、减少对aConcreteBuilder中函数调用的个数或顺序,就是完全不同的产品族;

“对象的组成部分”,两层含义:相同种类的不同组成部分,或不同个数的组成部分,即创建算法独立于对象组成部分的个数和类型;协作图中,“BuildPartA()”中的A可以是抽象的A、甚至aConcreteBuilder没有实现该方法(即对象的组成部分中没有A);

“它们的装配方式”,协作图中,“GetResult()”个人觉得和对象的装配方式相关性很大,当然没有具体的例子佐证。

举个栗子应该更好理解:借用做菜的例子,我们可以定义构建炖菜的组件:水、食材、调料;酸菜鱼的菜谱中,食材部分应该包括酸菜、鱼,水煮鱼的食材中可以不包括酸菜,尽管调料可以完全相同;酸菜鱼和水煮鱼的装配方式,也就是做菜算法,应该是和构建炖菜的组件相关性不大的。

也就是说Builder模式更加注重“构建”,对复杂对象中各个部分的构建(酸菜鱼中的各种材料如何准备妥当,而如何将准备好的食材用起来,做成好的酸菜鱼,就不是Builder模式的重点了。)。如果希望Director参与到“组装算法”中,可以将上一个过程生成的半成品,作为下一个组件构建环节的参数,当然这种参与是不涉及组装细节的,具体控制,还是在Builder的下一个构建环节中。