一 基本介绍
- 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
- 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
- 类图
二 应用实例
2.1 Pizza 类
package com.yqq.pattern.factory.abs.pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/18/20:15
* @Description:
*/
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.2 LDPepperPizza 类
package com.yqq.pattern.factory.abs.pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class LDPepperPizza extends Pizza {
public void prepare() {
this.setName("伦敦的胡椒披萨");
System.out.println("伦敦的胡椒披萨 准备原材料");
}
}
2.3 LDCheesePizza类
package com.yqq.pattern.factory.abs.pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class LDCheesePizza extends Pizza {
public void prepare() {
this.setName("伦敦的奶酪披萨");
System.out.println("伦敦的奶酪披萨 准备原材料");
}
}
2.4 BJPepperPizza类
package com.yqq.pattern.factory.abs.pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class BJPepperPizza extends Pizza {
public void prepare() {
this.setName("北京的胡椒披萨");
System.out.println("北京的胡椒披萨 准备原材料");
}
}
2.5 BJCheesePizza类
package com.yqq.pattern.factory.abs.pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class BJCheesePizza extends Pizza {
public void prepare() {
this.setName("北京的奶酪披萨");
System.out.println("北京的奶酪披萨 准备原材料");
}
}
2.6 AbsFactory类
package com.yqq.pattern.factory.abs.order;
import com.yqq.pattern.factory.abs.pizza.Pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:13
* @Description: 抽象工厂模式的抽象接口
*/
public interface AbsFactory {
//让下面的工厂子类来具体实现
public Pizza createPizza(String orderType);
}
2.7 BJFactory类
package com.yqq.pattern.factory.abs.order;
import com.yqq.pattern.factory.abs.pizza.BJCheesePizza;
import com.yqq.pattern.factory.abs.pizza.BJPepperPizza;
import com.yqq.pattern.factory.abs.pizza.Pizza;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:15
* @Description:
*/
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;
}
}
2.8 LDFactory类
package com.yqq.pattern.factory.abs.order;
import com.yqq.pattern.factory.abs.pizza.*;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:34
* @Description:
*/
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;
}
}
2.9 OrderPizza类
package com.yqq.pattern.factory.abs.order;
import com.yqq.pattern.factory.abs.pizza.Pizza;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:35
* @Description:
*/
public class OrderPizza {
AbsFactory factory;
public OrderPizza(AbsFactory factory){
setAbsFactory(factory);
}
public void setAbsFactory(AbsFactory factory){
Pizza pizza = null;
String orderType = "";//用户输入
this.factory = factory;
do {
orderType = getType();
pizza = factory.createPizza(orderType);
if (pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购失败");
break;
}
}while (true);
}
private String getType(){
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 类型:");
String line = reader.readLine();
return line;
}catch (Exception e){
e.fillInStackTrace();
return null;
}
}
}
2.10 PizzaStore类(测试)
package com.yqq.pattern.factory.abs.order;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:43
* @Description:
*/
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new LDFactory());
}
}