介绍
建造者模式(Builder)核心目的是通过使用多个简单对象一步步构建出一个复杂对象。通过将复杂对象的构造过程拆分为多个简单的步骤,使得创建对象更加灵活,可读性和可维护性更强。
使用场景
- 创建一个由多个部分组成的复杂对象,需要遵循特定顺序创建对象
- 相同的构建过程可以创建不同的对象表现(类似构造器重载)
- 不影响代码原来的功能情况下,方便扩展新的组成部分
建造者模式组成部分
- 产品(Product):表示最终要构建的复杂对象
- 建造者(Builder):定义用于构建产品的接口,包含创建产品各个部分的方法
- 具体建造者(Concrete Builder):实现Builder接口,完成产品各个部分的具体构建工作。
- 指挥者(Director):负责调用合适的建造者方法,按照特定顺序组装产品。
代码案例
在这个示例代码中,我们有一个Pizza
类,它有4个属性:面团、酱料、奶酪和配料。我们使用内部类Builder
来构建Pizza
实例。
public class Pizza {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings;
private Pizza(Builder builder) {
this.dough = builder.dough;
this.sauce = builder.sauce;
this.cheese = builder.cheese;
this.toppings = builder.toppings;
}
public static class Builder {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings = new ArrayList<String>();
public Builder(String dough, String sauce) {
this.dough = dough;
this.sauce = sauce;
}
public Builder cheese(String cheese) {
this.cheese = cheese;
return this;
}
public Builder toppings(String... toppings) {
this.toppings.addAll(Arrays.asList(toppings));
return this;
}
public Pizza build() {
return new Pizza(this);
}
}
@Override
public String toString() {
return "Pizza{" +
"dough='" + dough + '\'' +
", sauce='" + sauce + '\'' +
", cheese='" + cheese + '\'' +
", toppings=" + toppings +
'}';
}
}
在Builder
类中,我们有一个构造函数,它接受面团和酱料作为参数。我们还有两个方法cheese
和toppings
,用于设置cheese
和toppings
属性。
最后,我们有一个build
方法,它返回一个新的Pizza
实例。
使用建造者模式,我们可以这样构建一个Pizza
实例:
Pizza pizza = new Pizza.Builder("Thin Crust", "Tomato Sauce")
.cheese("Mozzarella")
.toppings("Pepperoni", "Mushrooms", "Onions")
.build();
System.out.println(pizza);
控制台输出:
Pizza{dough='Thin Crust', sauce='Tomato Sauce', cheese='Mozzarella', toppings=[Pepperoni, Mushrooms, Onions]}
小结
Builder模式是为了创建一个复杂的对象,需要多个步骤完成创建,或者需要多个零件组装的场景,且创建过程中可以灵活调用不同的步骤或组件。