一、什么是抽象工厂
1)抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类
2)抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
3)从设计层面看,抽象工厂模式主是对简单工厂模式的改进(或者称为进一步的抽象)。
4)将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
UML图
二、代码
Pizza基础,BJCheesePizaa,BJPeooerPizza,LDCheesePizza,LDPepperPizza 在上一章节(工厂方法模式)
定义抽象工厂接口
public interface AbsFactory {
/**
* 工厂子类实现
* @param orderType
* @return
*/
Pizza createPizza(String orderType);
}
两个工厂子类实现
public class BJFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
System.out.println(" 使用抽象工厂模式 ");
Pizza pizza = null;
if ("cheese".equals(orderType)){
pizza = new BJCheesePizza();
} else if ("pepper".equals(orderType)){
pizza = new BJPepperPizza();
}
return pizza;
}
}
public class LDFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
System.out.println(" 使用抽象工厂模式 ");
Pizza pizza = null;
if ("cheese".equals(orderType)){
pizza = new LDCheesePizza();
} else if ("pepper".equals(orderType)){
pizza = new LDPepperPizza();
}
return pizza;
}
}
订购Pizza类
public class OrderPizza {
AbsFactory absFactory;
Pizza pizza = null;
public OrderPizza3(AbsFactory factory) {
setFactory(factory);
}
private void setFactory(AbsFactory factory) {
String orderType; // 订购披萨的类型
this.absFactory = factory;
do {
orderType = getType();
pizza = this.absFactory.createPizza(orderType);
if (this.pizza != null) {
// 输出 pizza 制作过程
this.pizza.prepare();
this.pizza.bake();
this.pizza.cut();
this.pizza.box();
} else {
System.out.println(" 披萨制作失败 ");
break;
}
} while (true);
}
/**
* 写一个方法,可以获取客户希望订购的披萨种类
*
* @return
*/
private String getType() {
try {
BufferedReader string = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = string.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
测试
public class PizzaStore {
public static void main(String[] args) {
//new OrderPizza(new BJFactory());
new OrderPizza(new LDFactory());
}
}
三、工厂模式小结
1)工厂模式的意义
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
2)三种工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
3)设计模式的依赖抽象原则
创建对象实例时,不要直接 new 类,而把这个 new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
不要让类继承具体类,而继承抽象类或者是实现接口
不要覆盖基类中已经实现的方法。