工厂方法模式
看一个新的需求
披萨项目新的需求: 客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza,北京的胡椒pizza 或者 是伦敦的奶酪pizza,伦敦的胡椒pizza
思路1
使用简单工厂模式,创建出不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等. 从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性,可扩展性并不是特别好
思路2
使用工厂方法模式
工厂方法模式介绍
工厂方法模式设计方案: 将披萨项目的实例化功能抽象方法,在不同的口味点餐子类中具体实现
工厂方法模式: 定义了一个创建对象的抽象方法,由子类决定要实例化的类.工厂方法模式将 对象的实例化推迟到子类 .
工厂方法模式应用案例
披萨项目新的需求 ; 客户在点餐的过程中,可以点不同口味的披萨,比如, 北京的奶酪披萨,北京的胡椒披萨,或者是 伦敦的奶酪披萨,伦敦的胡椒披萨
类图演示
代码演示
OrderPizza
package com.atguigu.factory.factorymethod.pizzastore.order;
import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* ClassName: OrderPizza <br/>
* Description: OrderPizza <br/>
* Date: 2021-02-03 15:21 <br/>
* <br/>
*
* @author victor
* @version 产品版本信息 2021年02月03日15:21分 victor(victorfm@163.com) 新建<br/>
* <p>
* 修改记录
* @email victorfm@163.com
* @project java_mode
* @package com.atguigu.factory.factorymethod.pizzastore.order
*/
public abstract class OrderPizza {
// 定义一个抽象方法,createPizza,让各个工行子类自己实现
abstract Pizza createPizza(String orderType);
// 构造器
public OrderPizza() {
Pizza pizza = null;
String orderType; // 订购披萨类型
do {
orderType = getType();
//我么在这里直接调用createPizza这个方法
pizza = createPizza(orderType);
// 这个createPizza 是由他的工厂子类去实现
// 但是这个创建的方法在本类 他是一个抽象的方法
//
// 执行这个披萨的制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
// 写一个方法,可以获取客户希望订购的披萨种类
private String getType() {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = null;
try {
str = strin.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
北京的奶酪披萨
public class BJCheesePizza extends Pizza{
@Override
public void prepare() {
setName("北京的奶酪披萨");
System.out.println("给北京的奶酪披萨准备原材料!");
}
}
执行类
package com.atguigu.factory.factorymethod.pizzastore.pizza;
/**
* ClassName: Pizza <br/>
* Description: Pizza <br/>
* Date: 2021-02-03 15:14 <br/>
* <br/>
*
* @author victor
* @version 产品版本信息 2021年02月03日15:14分 victor(victorfm@163.com) 新建<br/>
* <p>
* 修改记录
* @email victorfm@163.com
* @project java_mode
* @package com.atguigu.factory.factorymethod.pizzastore
*/
public abstract class Pizza {
protected String name; // 披萨名字
// 准备原材料,不同的pizza是不一样的
// ,因此我们做成一个抽象方法
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+"boxting;");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
主方法
package com.atguigu.factory.factorymethod.pizzastore.order;
/**
* ClassName: PizzaStore <br/>
* Description: PizzaStore <br/>
* Date: 2021-02-03 16:51 <br/>
* <br/>
*
* @author victor
* @version 产品版本信息 2021年02月03日16:51分 victor(victorfm@163.com) 新建<br/>
* <p>
* 修改记录
* @email victorfm@163.com
* @project java_mode
* @package com.atguigu.factory.factorymethod.pizzastore.order
*/
public class PizzaStore {
public static void main(String[] args) {
// 创建北京口味 各种 Pizza
new BJOrderPizza();
/*
*
* input pizza type:
cheese
给北京的奶酪披萨准备原材料!
北京的奶酪披萨baking;
北京的奶酪披萨cutting;
北京的奶酪披萨boxting;
*
* input pizza type:
pepper
北京的胡椒披萨准备原材料!
北京的胡椒披萨baking;
北京的胡椒披萨cutting;
北京的胡椒披萨boxting;
* */
// todo 还可以 加上 北京or 伦敦的供用户选择的嗯
// 比如加上location
// 创建伦敦口额为的各种披萨
// new LDOrderPizza();
// 这个代码就不写了
// 你永远无法叫醒一个装睡的人
}
}