工厂方法模式
【场景介绍】
新增需求:客户在点披萨时,可以点不同口味的披萨。比如:北京的奶酪pizza、北京的胡椒pizza或伦敦的奶酪披萨等等
【简介】
工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类重具体实现
工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。(层级再增一级)
【OrderPizza
】
public abstract class OrderPizza {
//定义一个抽象方法,createPizza,让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
public OrderPizza(){
Pizza pizza =null;
String orderType;
do {
orderType = getType();
//用户输入pizza种类
pizza = createPizza(orderType);
if (pizza == null){
break;
}
//披萨制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.bake();
}while (true);
}
//获取用户希望订购的pizza种类
private String getType(){
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
return bufferedReader.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
【BJOrderPizza
】
public class BJOrderPizza extends OrderPizza{
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if ("cheese".equals(orderType)){
pizza = new BJCheesePizza();
pizza.setName("北京奶酪pizza");
return pizza;
}else if ("pepper".equals(orderType)){
pizza = new BJPepperPizza();
pizza.setName("北京胡椒pizza");
return pizza;
}else {
return null;
}
}
}
【LDOrderPizza
】
public class LDOrderPizza extends OrderPizza{
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if ("cheese".equals(orderType)){
pizza = new LDCheesePizza();
pizza.setName("伦敦奶酪披萨");
return pizza;
}else if ("pepper".equals(orderType)){
pizza = new LDPepperPizza();
pizza.setName("伦敦胡椒披萨");
return pizza;
}else {
return null;
}
}
}
【Pizza
】
public abstract class Pizza {
protected String name;
//准备原材料,不同的披萨不一样
public abstract void prepare();
//烘焙
public void bake(){
System.out.println(name + "baking;");
}
//裁剪
public void cut(){
System.out.println(name + "cutting;");
}
//打包
public void box(){
System.out.println(name + "boxing;");
}
public void setName(String name) {
this.name = name;
}
}
【BJCheesePizza
】
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("北京奶酪披萨 准备原材料");
}
}
【BJPepperPizza
】
public class BJPepperPizza extends Pizza {
@Override
public void prepare() {
System.out.println("北京胡椒披萨 准备原材料");
}
}
【LDCheesePizza
】
public class LDCheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("伦敦奶酪披萨 准备原材料");
}
}
【LDPepperPizza
】
public class LDPepperPizza extends Pizza {
@Override
public void prepare() {
System.out.println("伦敦胡椒披萨 准备原材料");
}
}
【PizzaStore
】
public class PizzaStore {
public static void main(String[] args) {
//使用时只需要new出需要使用到的子类即可
new BJOrderPizza();
new LDOrderPizza();
}
}
【运行结果】
在使用者
PizzaStore
中只需要new出不同OrderPizza
实现子类即可