应用案例:客户点披萨时,可以点不同地点、不同口味的披萨,比如北京的奶酪披萨、北京的胡椒披萨 或者伦敦的奶酪披萨、伦敦的胡椒披萨
相比于简单工厂模式的案例,多了一个维度条件,直接使用简单工厂模式的话,会导致多个简单工厂类中有大量重复的代码,这里相当于使用了一个模版方法模式,抽取重复的部分到父类,而抽象一个方法教给子类去实现
披萨父类:
public class Pizza {
private String name = "";
public void setName(String name){
this.name = name;
}
public void prepare(){
}
public void bake(){
System.out.println(name + " 烧烤中。。。");
}
public void cut(){
System.out.println(name + " 切割。。。");
}
public void box(){
System.out.println(name + " 打包。。。");
}
}
伦敦胡椒披萨:
public class LDPepperPizza extends Pizza {
@Override
public void prepare() {
super.prepare();
System.out.println("伦敦胡椒披萨,准备中。。。");
}
}
伦敦起司披萨
public class LDCheesePizza extends Pizza {
@Override
public void prepare() {
super.prepare();
System.out.println("伦敦奶酪披萨,准备中。。。");
}
}
北京起司披萨
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
super.prepare();
System.out.println("北京奶酪披萨,准备中。。。");
}
}
北京胡椒披萨
public class BJPepperPizza extends Pizza {
@Override
public void prepare() {
super.prepare();
System.out.println("北京胡椒披萨,准备中。。。");
}
}
抽象方法工厂类
public abstract class PizzaMethodFactory {
//定义一个抽象方法,createPizza , 让各个工厂子类自己实现
abstract Pizza orderPizza(String orderType);
// 各个子类公用方法
public createPizza(String orderType) {
Pizza pizza = null;
//抽象方法,由工厂子类完成
pizza = orderPizza(orderType);
if (pizza != null){
//输出 pizza 制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else{
System.out.println("订购失败。。");
}
}
}
北京披萨工厂
public class BJPizzaFactory extends PizzaMethodFactory {
@Override
Pizza orderPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new BJPepperPizza();
}
return pizza;
}
}
伦敦披萨工厂
public class LDPizzaFactory extends PizzaMethodFactory {
@Override
Pizza orderPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new LDPepperPizza();
}
return pizza;
}
}
用法:
public static void main(String args[]){
PizzaMethodFactory bjMethodFactory = new BJPizzaFactory();
bjMethodFactory.createPizza("cheese");
}