将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
看做外卖生意赚钱容易,小明也开了一家披萨外卖店。做披萨通常需要制作面饼、加馅料、加调味酱、加芝士和烘焙5个步骤,为了提高效率,小明组建了“披萨流水线”,每条流水线5个人,分别负责5个步骤;两组流水线分别制作水果披萨和海鲜披萨。
为了协调流水线的生成,保证每个步骤都被执行到位,小明又聘请了专门的监督员来监督整个制作过程。
小明学过设计模式,很快想到,这不就是建造者模式吗?
UML图:
代码:
public class Pizza {
private String crust;
private String ingredients;
private String sauce;
public Pizza() {
}
public String toString() {
return crust + ingredients + "披萨";
}
public String getCrust() {
return crust;
}
public void setCrust(String crust) {
this.crust = crust;
}
public String getIngredients() {
return ingredients;
}
public void setIngredients(String ingredients) {
this.ingredients = ingredients;
}
public String getSauce() {
return sauce;
}
public void setSauce(String sauce) {
this.sauce = sauce;
}
}
public abstract class Builder {
protected Pizza pizza = new Pizza();
public abstract void makeCrust();
public abstract void addIngredients();
public abstract void addSauce();
public abstract void addCheese();
public abstract void bake();
public Pizza getPizza() {
return pizza;
}
}
public class FruitBuilder extends Builder {
@Override
public void makeCrust() {
pizza.setCrust("芝心");
System.out.println("制作芝心面饼");
}
@Override
public void addIngredients() {
pizza.setIngredients("水果");
System.out.println("加入菠萝");
}
@Override
public void addSauce() {
pizza.setSauce("番茄酱");
System.out.println("加入番茄酱");
}
@Override
public void addCheese() {
System.out.println("加入芝士");
}
@Override
public void bake() {
System.out.println("烘烤");
}
}
public class SeafoodBuilder extends Builder {
@Override
public void makeCrust() {
pizza.setCrust("经典手拍");
System.out.println("制作经典手拍面饼");
}
@Override
public void addIngredients() {
pizza.setIngredients("海鲜");
System.out.println("加入海鲜馅料");
}
@Override
public void addSauce() {
pizza.setSauce("香辣酱");
System.out.println("加入香辣酱");
}
@Override
public void addCheese() {
System.out.println("加入芝士");
}
@Override
public void bake() {
System.out.println("烘烤");
}
}
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Pizza build() {
builder.makeCrust();
builder.addIngredients();
builder.addSauce();
builder.addCheese();
builder.bake();
return builder.getPizza();
}
}
客户端:
public class Client {
public static void main(String[] args) {
Director director = new Director(new FruitBuilder());
Pizza fruitPizza = director.build();
System.out.println("制作完成: " + fruitPizza);
director = new Director(new SeafoodBuilder());
Pizza seafoodPizza = director.build();
System.out.println("制作完成: " + seafoodPizza);
}
}