定义
- 分离复杂对象的构建和表示
- 同样的构建过程可以创建不同的表示
- 无需记忆, 自然使用
举个地形构建器的例子:
//地形构建器
public interface TerrainBuilder {
TerrainBuilder buildWall(); // build墙
TerrainBuilder buildFort(); // build暗堡
TerrainBuilder buildMine(); // build地雷
Terrain build();
}
3个buildXXX的方法, 返回值都是TerrainBuilder, 为了方便链式调用
public class ComplexTerrainBuilder implements TerrainBuilder {
Terrain terrain = new Terrain();
@Override
public TerrainBuilder buildWall() {
terrain.w = new Wall(10, 10, 50, 50);
return this; // 链式调用
}
@Override
public TerrainBuilder buildFort() {
terrain.f = new Fort(10, 10, 50, 50);
return this;
}
@Override
public TerrainBuilder buildMine() {
terrain.m = new Mine(10, 10, 50, 50);
return this;
}
@Override
public Terrain build() {
return terrain;
}
}
Main.java
public class Main {
public static void main(String[] args) {
TerrainBuilder builder = new ComplexTerrainBuilder();
Terrain t = builder.buildFort().buildMine().buildWall().build(); // 链式调用
}
}
你可以有多种不同的Builder, 重要的是, 构建对象的逻辑, 被分离了出来
适用场景
当构建一个对象时, 参数特别多的时候, 适合用这个模式
再来看一个例子:
public class Person {
// 基本类型和字符串
int id;
String name;
int age;
double weight;
int score;
// 也支持任意对象
Location loc;
private Person() {}
public static class PersonBuilder {
Person p = new Person();
public PersonBuilder basicInfo(int id, String name, int age) {
p.id = id;
p.name = name;
p.age = age;
return this;
}
public PersonBuilder weight(double weight) {
p.weight = weight;
return this;
}
public PersonBuilder score(int score) {
p.score = score;
return this;
}
public PersonBuilder loc(String street, String roomNo) {
p.loc = new Location(street, roomNo);
return this;
}
public Person build() {
return p;
}
}
}
class Location {
String street;
String roomNo;
public Location(String street, String roomNo) {
this.street = street;
this.roomNo = roomNo;
}
}