抽象工厂模式介绍
1、抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需知名具体的类
2、抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
3、从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
4、将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类,这样将单个的简单工厂类变
成了工厂类,更利于代码的维护和扩展。
案例描述
客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪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 absfactorymethod.order;
import absfactorymethod.pizza.Pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 15:19
*/
public interface AbsFactory {
public Pizza createPizza(String orderType);
}
2、创建北京披萨工厂的实现类,实现披萨工厂的抽象类
package absfactorymethod.order;
import absfactorymethod.pizza.BJCheesePizza;
import absfactorymethod.pizza.BJPepperPizza;
import absfactorymethod.pizza.Pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 16:21
*/
public class BJFactory implements AbsFactory {
public 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 absfactorymethod.order;
import absfactorymethod.pizza.LDCheesePizza;
import absfactorymethod.pizza.LDPepperPizza;
import absfactorymethod.pizza.Pizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 16:25
*/
public class LDFactory implements AbsFactory {
public 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 absfactorymethod.order;
import absfactorymethod.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/22 10:48
*/
public class OrderPizza {
public OrderPizza(AbsFactory factory) {
setFactory(factory);
}
public void setFactory(AbsFactory factory) {
Pizza pizza = null;
String orderType = ""; // 用户输入
do {
orderType = getType();
// factory 可能是北京工厂子类,也可能是伦敦的工厂子类
pizza = factory.createPizza(orderType);
if(pizza != null) { // 订购成功
pizza.prepare();;
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购失败!");
break;
}
}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 "";
}
}
}
调用方法
package absfactorymethod;
import absfactorymethod.order.BJFactory;
import absfactorymethod.order.LDFactory;
import absfactorymethod.order.OrderPizza;
/**
* @Description:
* @Author: hzm
* @CreateDate: 2022/12/21 16:30
*/
public class PizzaStore {
public static void main(String[] args) {
// 北京工厂
// new OrderPizza(new BJFactory());
// 伦敦工厂
new OrderPizza(new LDFactory());
}
}