假设我有一个汽车制造商,它有模型、颜色和速度等参数:
public class Car {
private String model;
private int color;
private int speed;
public Car(String model, int color, int speed) {
this.model = model;
this.color = color;
this.speed = speed;
}
//..Getters
public static class Builder {
private String model;
private int color;
private int speed;
public Builder model(String model) {
this.model = model;
return this;
}
public Builder color(int color) {
this.color = color;
return this;
}
public Builder speed(int speed) {
this.speed = speed;
return this;
}
public Car build() {
return new Car(model, color, speed);
}
}
}
我造的车是这样的:
Car car1 = new Car.Builder()
.model("Audi")
.color(Color.RED.getRGB())
.speed(200)
.build();
Car car2 = new Car.Builder()
.model("Audi")
.color(Color.RED.getRGB())
.speed(350)
.build();
Car car3 = new Car.Builder()
.model("Audi")
.color(Color.RED.getRGB())
.speed(175)
.build();
正如你所看到的,我有一些参数需要不断地复制。我希望能够在一些现有空白的基础上制造新车,比如:
Car car1 = new Car.Builder()
.initFrom(redAudi)
.speed(200)
.build();
Car car2 = new Car.Builder()
.initFrom(redAudi)
.speed(350)
.build();
Car car3 = new Car.Builder()
.initFrom(redAudi)
.speed(175)
.build();
}
是否有任何模板对此进行了规定?
3条答案
按热度按时间xdnvmnnf1#
这是一个常见的问题。基本上,你需要暴露一个
asBuilder()
. 此示例方法获取一个用传递的示例的值初始化的生成器。实施
asBuilder()
应该直截了当。而且,您似乎正在生成许多样板文件。如果将代码库与代码生成器连接起来对您来说不是问题,那么可以使用
Lombok
绝大多数项目使用的库。ivqmmu1c2#
添加方法
initFrom(Car)
给你的Builder
类,它调用给定Car
示例并用返回值初始化其参数。后来对Builder
的方法可能会用正确的值覆盖这些值。接下来你可以介绍一个
TemplateCar
类作为新的父类Car
它允许使用不完整的参数集进行构建,并且有自己的Builder
(当然,您需要将上述方法更改为initFrom(TemplateCar)
).这就是你要“模板”的意思吗?
monwx1rj3#
谢谢你的回答!我决定使用@tquadrat的解决方案,但要扩展一下。我决定为初始化构建器的类添加一个接口。
汽车.java
carbuilderinitializer.java文件
yourcustombuildercar.java
客户端代码:car1=new car.builder().initfrom(new yourcustombuildercar()).speed(200).build();