建造者(Builder)模式
# 建造者(Builder)模式

- 建造者模式(Builder Pattern) 又叫 生成器模式,是一种对象 构建模式。它可以将复杂对象的建造过程抽象出 来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
- 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们, 用户不需要知道内部的具体构建细节。
创建的东西细节复杂,还必须暴露给使用者。屏蔽过程而不屏蔽细节
产品角色(Product):Phone
/**
* 只暴露get方法 不暴露set方法
*/
public class Phone {
protected String cpu;
protected String mem;
protected String disk;
protected String cam;
public String getCpu() {
return cpu;
}
public String getMem() {
return mem;
}
public String getDisk() {
return disk;
}
public String getCam() {
return cam;
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", mem='" + mem + '\'' +
", disk='" + disk + '\'' +
", cam='" + cam + '\'' +
'}';
}
}
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
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
抽象建造者(Builder):AbstracPhoneBuilder
public abstract class AbstractBuilder {
Phone phone;
abstract void customCpu(String cpu);
abstract void customMem(String mem);
abstract void customDisk(String disk);
abstract void customCam(String cam);
Phone getProduct() {
return phone;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
具体建造者 (Concrete Builder):PhoneBuilder
public class XiaomiBuilder extends AbstractBuilder {
public XiaomiBuilder() {
phone = new Phone();
}
@Override
void customCpu(String cpu) {
phone.cpu = cpu;
}
@Override
void customMem(String mem) {
phone.mem = mem;
}
@Override
void customDisk(String disk) {
phone.disk = disk;
}
@Override
void customCam(String cam) {
phone.cam = cam;
}
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
测试方法:
public static void main(String[] args) {
AbstractBuilder builder = new XiaomiBuilder();
builder.customCpu("骁龙888");
builder.customCam("一亿");
builder.customDisk("512G");
builder.customMem("12G");
}
1
2
3
4
5
6
7
2
3
4
5
6
7
在建造者模式中常用的链式我们也可以实现,只需将设置属性方法返回自身即可。
抽象建造者:
public abstract class AbstractBuilder2 {
Phone phone;
abstract AbstractBuilder2 customCpu(String cpu);
abstract AbstractBuilder2 customMem(String mem);
abstract AbstractBuilder2 customDisk(String disk);
abstract AbstractBuilder2 customCam(String cam);
Phone getProduct() {
return phone;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
具体建造者:
public class XiaomiBuilder2 extends AbstractBuilder2 {
public XiaomiBuilder2() {
phone = new Phone();
}
@Override
AbstractBuilder2 customCpu(String cpu) {
phone.cpu = cpu;
return this;
}
@Override
AbstractBuilder2 customMem(String mem) {
phone.mem = mem;
return this;
}
@Override
AbstractBuilder2 customDisk(String disk) {
phone.disk = disk;
return this;
}
@Override
AbstractBuilder2 customCam(String cam) {
phone.cam = cam;
return this;
}
}
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
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
测试方法:
public static void main(String[] args) {
//链式调用
AbstractBuilder2 builder2 = new XiaomiBuilder2();
Phone phone2 = builder2.customCpu("天玑9000").customCam("6400万").customMem("12G")
.customDisk("512G").getProduct();
System.out.println(phone2);
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 应用场景
- StringBuilder:append (); 给谁 append 呢?
- Swagger-ApiBuilder:
- 快速实现。Lombok-Builder 模式
- 编写代码的时候使用到了设计模式。类 + 模式
- xxxFactory
- xxxTemplate
- xxxBuilder
- xxxFacede
java.lang.StringBuilder 中的建造者模式

- Appendable 接口定义了多个 append 方法 (抽象方法), 即 Appendable 为抽象建造者,定义了抽象方法
- AbstractStringBuilder 实现了 Appendable 接口方法,这里的 AbstractStringBuilder 已经是建造者,只是不能实例化
- StringBuilder 即充当了指挥者角色,同时充当了具体的建造者,建造方法的实现是由 AbstractStringBuilder 完成,而 StringBuilder 继承了 AbstractStringBuilder
# 建造者模式的注意事项和细节
- 客户端 (使用程序) 不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可 以创建不同的产品对象
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具 体建造者, 用户使用不同的具体建造者即可得到不同的产品对象
- 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰, 也更方便使用程序来控制创建过程
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合 “开闭 原则”
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使 用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因 此在这种情况下,要考虑是否选择建造者模式.
- 抽象工厂模式 VS 建造者模式 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采 用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定 的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02