设计模式-生成器
# 介绍
一个对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
可以用于编译器词法分析器指导生成抽象语法树、构造迷宫等。
和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用Construct方法构造产品BuilderProduct,但是它不直接参与构造过程,而是把构造的任务交给生成器(Builder)。Builder提供了产品每一个部件构造的实现方法(可以是默认实现),但是如果要获得最终的产品,需要派生Builder的子类,添加getResult方法返回最终的产品对象。BuildPart方法正是被指导者调用指挥产品生产流程的接口。
在JDK中StringBuilder就是用法的生成器模式。
# 应用场景
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
生成器模式优点:
# 优点
- 将一个复杂对象的创建过程封装起来。这里我们将每一个对象“可能”的创建过程封装在具体生成器实现类中。
- 允许对象通过多个步骤来创建,并且可以改变过程。这里我们可以通过Client来改变(自由搭配)对象的创建步骤,而不是像其它工厂模式一样只有一个步骤。这也就是定义中提到的同样的创建过程可以创建不同的表示。
- 向客户隐藏产品的内部实现。(这一点是所有创建型模式都有的)
- 产品的实现可以被替换,因为客户(注意这里的客户是指调用者)只看到一个抽象的接口。(所有的抽象都是用来干这个事的,呵呵)
# 实现
public interface Builder {
Builder buildBody(String s);
Builder buildHead(String s);
Builder buildTail(String s);
}
public class HtmlBuilder implements Builder {
@Override
public Builder buildBody(String s) {
return this;
}
@Override
public Builder buildHead(String s) {
return this;
}
@Override
public Builder buildTail(String s) {
return this;
}
}
public class TxtBuilder implements Builder {
@Override
public Builder buildBody(String s) {
return this;
}
@Override
public Builder buildHead(String s) {
return this;
}
@Override
public Builder buildTail(String s) {
return this;
}
}
public class Editer {
private Builder builder;
public Editer(Builder builder) {
this.builder = builder;
//do something
}
}
public class BuilderTest {
public static void main(String[] args) {
new Editer(new TxtBuilder());
new Editer(new HtmlBuilder());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11