不使用生成器模式
如果不使用生成器模式,当一个类的构造函数有多个可选参数时,可能会导致构造函数的参数列表非常长,而且在创建对象时需要传递大量的参数,这不仅使得代码难以阅读和维护,还可能因为参数顺序错误而导致错误
java
public class Phone {
private String cpu;
private String screen;
private String memory;
private String mainboard;
// 构造函数有多个参数
public Phone(String cpu, String screen, String memory, String mainboard) {
this.cpu = cpu;
this.screen = screen;
this.memory = memory;
this.mainboard = mainboard;
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
}
public class Client {
public static void main(String[] args) {
// 创建Phone对象时需要传递所有参数
Phone phone = new Phone("Intel Core i7", "13.3 inch", "16GB", "Intel HM");
System.out.println(phone);
}
}
使用生成器模式
在这个例子中,Phone
类是需要构建的复杂对象,它有多个可选的属性,如 CPU、屏幕、内存和主板等。
通过使用生成器模式,我们创建了一个 Builder
类来逐步设置这些属性,最后调用 build()
方法生成最终的手机对象。
这样,用户可以根据自己的需求灵活地选择不同的配置来构建手机,而不需要在构造函数中处理大量的参数。
java
public class Phone {
private String cpu;
private String screen;
private String memory;
private String mainboard;
private Phone(Builder builder) {
this.cpu = builder.cpu;
this.screen = builder.screen;
this.memory = builder.memory;
this.mainboard = builder.mainboard;
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
public static class Builder {
private String cpu;
private String screen;
private String memory;
private String mainboard;
public Builder cpu(String val) {
cpu = val;
return this;
}
public Builder screen(String val) {
screen = val;
return this;
}
public Builder memory(String val) {
memory = val;
return this;
}
public Builder mainboard(String val) {
mainboard = val;
return this;
}
public Phone build() {
return new Phone(this);
}
}
}
客户端代码
java
public class Client {
public static void main(String[] args) {
Phone phone = new Phone.Builder()
.cpu("Intel Core i7")
.memory("16GB")
.screen("13.3 inch")
.mainboard("Intel HM")
.build();
System.out.println(phone);
}
}