场景: 用户需要下单美国披萨,中国披萨, 前一个简单工厂模式就不是能很好的满足现在的需求了。
- 工厂方法模式: 定义一个创建对象的抽象方法,在子类决定需要实例化的类。工厂方法模式将对象的实例化推迟到子类中。
Pizza顶级父类
public abstract class Pizza {
protected String name;
/**
* 准备原材料,不同的Pizza原材料不一样,设置成抽象方法,留给子类重写
*/
public abstract void prepare();
public void bake() {
System.out.println(name + " 正在烘烤");
}
public void cut() {
System.out.println(name + " 正在剪切");
}
public void box() {
System.out.println(name + " 正在打包");
}
public Pizza setName(String name) {
this.name = name;
return this;
}
}
不同地区,下单的类不一样,这是所有地区的顶级父类
public abstract class OrderPizza {
abstract Pizza createPizza(String orderType); //留给子类实现
public OrderPizza() {
Pizza pizza = null;
String orderType;
do {
orderType = getType();
pizza = createPizza(orderType);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("下单失败,请重试l");
}
} while (true);
}
public String getType() {
Scanner scanner = new Scanner(System.in);
return scanner.next();
}
}
天津的Pizza店
public class TJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if ("TJCheesePizza".equals(orderType)) {
pizza = new TJCheesePizza().setName("天津芝士披萨");
} else if ("TJGreekPizza".equals(orderType)) {
pizza = new TJGreekPizza().setName("天津希腊披萨");
}
return pizza;
}
}
北京的Pizza店
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if ("BJCheesePizza".equals(orderType)) {
pizza = new TJCheesePizza().setName("北京芝士披萨");
}
return pizza;
}
}
不同的地区需要写不同Pizza类,而且要继承Pizza顶级父类
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
setName("重庆芝士披萨");
System.out.println(this.name + "准备材料");
}
}