模板方法模式 Template Pattern
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
回到小明的披萨店。见建造者模式
经营一段时间后,小明开始思考如何降低人力成本,他意识到,如果能够通过规则保证每个步骤的正确执行,就不需要额外的监督员;而且制作披萨的加芝士和烘焙步骤,两种披萨是一样的,是否可以考虑合并。
小明用程序员的大脑思考了一会,想到了模板方法模式。
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 final void addCheese() {
System.out.println("加入芝士");
}
public final void bake() {
System.out.println("烘烤");
}
public final Pizza build() {
makeCrust();
addIngredients();
addSauce();
addCheese();
bake();
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("加入番茄酱");
}
}
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("加入香辣酱");
}
}
客户端:
public class Client {
public static void main(String[] args) {
Builder fruitBuilder = new FruitBuilder();
Pizza fruitPizza = fruitBuilder.build();
System.out.println(fruitPizza);
Builder seafoodBuilder = new SeafoodBuilder();
Pizza seafoodPizza = seafoodBuilder.build();
System.out.println(seafoodPizza);
}
}