抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式义了一个interface用于创建相关或有依赖关系的对象族,而无需指明具体的类
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
3 . 从设计层面看,抽象工厂模式就是对简答工厂模式的进一步抽象改进
4 . 将工厂抽象为两层,AbsFactory(抽象工厂)和具体实现的工厂子类,程序员可以根据创建对象类型使用对应的工厂子
类,这样将单个的简单工厂变成了工厂簇,更利于代码的维护和扩展
5 . 代码实现
public interface AbsFactory {
public Pizza createPizza(String orderType);
}
public class BjFactory implements AbsFactory{
@Override
public Pizza createPizza(String orderType) {
System.out.println("使用抽象工厂模式");
Pizza pizza=null;
if(orderType.equals("cheese")) {
pizza = new BjCheesePizza();
}else if(orderType.equals("pepper")) {
pizza = new BjPepperPizza();
}
return pizza;
}
}
public class LdFactory implements AbsFactory{
@Override
public Pizza createPizza(String orderType) {
System.out.println("使用抽象工厂模式");
Pizza pizza=null;
if(orderType.equals("cheese")) {
pizza = new LdCheesePizza();
}else if(orderType.equals("pepper")) {
pizza = new LdPepperPizza();
}
return pizza;
}
}
public class PizzaOrder {
AbsFactory factory;
public PizzaOrder(AbsFactory absFactory) {
setFactory(absFactory);
}
private void setFactory(AbsFactory absFactory) {
Pizza pizza=null;
String orderType="";
this.factory=absFactory;
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 strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
public class PizzaStore {
public static void main(String[] args) {
new PizzaOrder(new LdFactory());
}
}
产品族和等级结构
为了更清晰地理解抽象工厂模式,需要先引入两个概念:
产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
从上边的图中我们可以更清晰的看到同族产品和同一等级结构的产品的联系和区别。海尔电视机和长虹电视机都是电视机的子类,这样的关系叫做同一等级结构;海尔电视机和海尔电冰箱都是海尔公司生产的产品,所以他们都是同族产品。
我们还可以通过下边的相图可以更加清楚的看出来,横轴表示等级结构,向横轴做垂线,在同一条垂线上的是同一个等级结构,纵轴便是产品组,向纵轴做垂线,同一条垂线上的是一个产品族。