建造者模式

建造者模式依旧是一种创建型设计模式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

举个例子,假如你要构建一个类的对象,需要往里面传50个参数。那么构建的时候,可以先构建part1,然后再构建part2,等等,最后构建完成。

为什么要折腾这么多事情,不能一次构建完吗?

那么你每次需要构建的时候都把需要的参数填上,不需要的填null,每次构建都填五十多个,会把人类似,所以最好还是用builder。

当使用建造者模式时,通常会有一个产品类、一个建造者类和一个指导者类。

以创建一个简单的汽车对象为例:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// 产品类:汽车
class Car {
private String make;
private String model;
private int year;
private String color;

public Car(String make, String model, int year, String color) {
this.make = make;
this.model = model;
this.year = year;
this.color = color;
}

// Getters
public String getMake() {
return make;
}

public String getModel() {
return model;
}

public int getYear() {
return year;
}

public String getColor() {
return color;
}

@Override
public String toString() {
return "Car{" +
"make='" + make + '\'' +
", model='" + model + '\'' +
", year=" + year +
", color='" + color + '\'' +
'}';
}
}

// 建造者类:用于构建汽车对象
class CarBuilder {
private String make;
private String model;
private int year;
private String color;

public CarBuilder setMake(String make) {
this.make = make;
return this;
}

public CarBuilder setModel(String model) {
this.model = model;
return this;
}

public CarBuilder setYear(int year) {
this.year = year;
return this;
}

public CarBuilder setColor(String color) {
this.color = color;
return this;
}

public Car build() {
return new Car(make, model, year, color);
}
}

// 指导者类:负责按照一定的顺序调用建造者类的方法来构建产品对象
class CarDirector {
public Car constructSportsCar() {
return new CarBuilder()
.setMake("Ferrari")
.setModel("488 GTB")
.setYear(2022)
.setColor("Red")
.build();
}
}

public class BuilderPatternExample {
public static void main(String[] args) {
CarDirector carDirector = new CarDirector();
Car sportsCar = carDirector.constructSportsCar();
System.out.println(sportsCar);
}
}

当然建造者类CarBuilder也可以放到Car类里面作为一个静态内部类,只用来构建Car,所以也可以称为静态工厂。

如果想要修改构造的参数数量或顺序的话,只需要修改CarDirector类就可以了,不需要的参数注释掉,不用每次都传入。