工厂方法模式介绍
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
案例描述
客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza,北京的胡椒pizza,或者是伦敦的奶酪pizza,伦敦的胡椒pizza。
披萨种类的类关系描述
1、创建披萨抽象类
package pizzastore.pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 14:24
*/
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;
}
}
2、创建北京奶酪披萨,并继承创建披萨抽象类
package pizzastore.pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 14:28
*/
public class BJCheesePizza extends Pizza{
@Override
public void prepare() {
setName("北京的奶酪Pizza");
System.out.println("北京的奶酪Pizza 准备原材料");
}
}
3、创建北京胡椒披萨,并继承创建披萨抽象类
package pizzastore.pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 14:29
*/
public class BJPepperPizza extends Pizza{
@Override
public void prepare() {
setName("北京的胡椒Pizza");
System.out.println("北京的胡椒Pizza 准备原材料");
}
}
4、创建伦敦奶酪披萨,并继承创建披萨抽象类
package pizzastore.pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 14:28
*/
public class LDCheesePizza extends Pizza{
@Override
public void prepare() {
setName("伦敦的奶酪Pizza");
System.out.println("伦敦的奶酪Pizza 准备原材料");
}
}
5、创建伦敦胡椒披萨,并继承创建披萨抽象类
package pizzastore.pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 14:29
*/
public class LDPepperPizza extends Pizza{
@Override
public void prepare() {
setName("伦敦的胡椒Pizza");
System.out.println("伦敦的胡椒Pizza 准备原材料");
}
}
披萨订购的类关系描述
1、创建披萨订购抽象类
package pizzastore.order;
import pizzastore.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 15:19
*/
public abstract class OrderPizza {
/**
* 定义抽象方法,createPizza , 让各个工厂子类实现
* @param orderType
* @return
*/
abstract Pizza createPizza(String orderType);
/**
* 无参构造函数,订购披萨方法
*/
public OrderPizza() {
Pizza pizza = null;
String orderType; // 订购披萨的类型
do{
orderType = getType();
pizza = createPizza(orderType); // 抽象方法,由工厂子类实现完成
// 输出pizza 制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while(true);
}
/**
* 定义输入披萨种类
* @return
*/
public String getType(){
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
2、创建北京订购披萨方法类,并继承披萨订购抽象类
package pizzastore.order;
import pizzastore.pizza.BJCheesePizza;
import pizzastore.pizza.BJPepperPizza;
import pizzastore.pizza.Pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 16:21
*/
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if(orderType.equals("pepper")) {
pizza = new BJPepperPizza();
}
return pizza;
}
}
3、创建伦敦订购披萨方法类,并继承披萨订购抽象类
package pizzastore.order;
import pizzastore.pizza.LDCheesePizza;
import pizzastore.pizza.Pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 16:25
*/
public class LDOrderPizza extends OrderPizza{
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")) {
pizza = new LDCheesePizza();
} else if(orderType.equals("pepper")) {
pizza = new LDPepperPizza();
}
return pizza;
}
}
调用方法
package pizzastore;
import pizzastore.order.BJOrderPizza;
import pizzastore.order.LDOrderPizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 16:30
*/
public class PizzaStore {
public static void main(String[] args) {
// 北京订购方法
new BJOrderPizza();
// 伦敦订购方法
new LDOrderPizza();
}
}
注:java中子类继承父类各方法的执行顺序:(这里只写jvm自动调用的方法的顺序,包括静态代码块、代码块、构造方法)
1、第一次创建子类对象
父类静态代码块
子类静态代码块
父类代码块
父类构造方法
子类代码块
子类构造方法
2、之后创建子类对象,子类和父类的静态代码块不会执行,其余不变。