设计模式构建器模式/Java 实现
示例
通过Builder模式,您可以以易于阅读的方式创建具有许多可选变量的类的实例。
考虑以下代码:
public class Computer {
public GraphicsCard graphicsCard;
public Monitor[] monitors;
public Processor processor;
public Memory[] ram;
//更多类变量在这里...
Computer(GraphicsCard g, Monitor[] m, Processer p, Memory ram) {
//为简洁起见,省略了代码...
}
//类方法被省略...
}如果所有参数都是必需的,那么一切都很好。如果有更多的变量和/或其中一些是可选的怎么办?您不想使用必需参数和可选参数的每种可能的组合来创建大量的构造函数,因为它变得难以维护且开发人员难以理解。您可能也不想拥有一长串的参数,用户可能需要在其中输入许多为null。
Builder模式创建一个称为Builder的内部类,该类仅用于实例化所需的可选变量。这是通过针对每个可选变量的方法来完成的,这些方法将变量类型作为参数并返回一个Builder对象,以便这些方法可以彼此链接。任何必需的变量都会放入Builder构造函数中,这样就不会遗漏它们。
生成器还包含一个称为的方法build(),该方法返回其所在的对象,并且在构建对象时必须在方法调用链的末尾调用该方法。
在前面的示例之后,此代码对Computer类使用了Builder模式。
public class Computer {
private GraphicsCard graphicsCard;
private Monitor[] monitors;
private Processor processor;
private Memory[] ram;
//更多类变量在这里...
private Computer(Builder builder) {
this.graphicsCard= builder.graphicsCard;
this.monitors= builder.monitors;
this.processor= builder.processor;
this.ram= builder.ram;
}
public GraphicsCard getGraphicsCard() {
return this.graphicsCard;
}
public Monitor[] getMonitors() {
return this.monitors;
}
public Processor getProcessor() {
return this.processor;
}
public Memory[] getRam() {
return this.ram;
}
public static class Builder {
private GraphicsCard graphicsCard;
private Monitor[] monitors;
private Processor processor;
private Memory[] ram;
public Builder(Processor p){
this.processor= p;
}
public Builder graphicsCard(GraphicsCard g) {
this.graphicsCard= g;
return this;
}
public Builder monitors(Monitor[] mg) {
this.monitors= mg;
return this;
}
public Builder ram(Memory[] ram) {
this.ram= ram;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}有关如何使用此类的示例:
public class ComputerExample {
public static void main(String[] args) {
Computer headlessComputer = new Computer.Builder(new Processor("Intel-i3"))
.graphicsCard(new GraphicsCard("GTX-960"))
.build();
Computer gamingPC = new Computer.Builder(new Processor("Intel-i7-quadcode"))
.graphicsCard(new GraphicsCard("DX11"))
.monitors(new Monitor[] = {new Monitor("acer-s7"), new Monitor("acer-s7")})
.ram(new Memory[] = {new Memory("2GB"), new Memory("2GB"), new Memory("2GB"), new Memory("2GB")})
.build();
}
}此示例说明了构建器模式如何在不费吹灰之力的情况下就如何为类创建提供了很大的灵活性。Computer对象可以基于调用者所需的配置以易于阅读的方式轻松实现。