抽象工厂模式的例子举起来要写的代码就比较多,所以单独写一篇,如果对工厂模式感兴趣,可以参见设计模式——工厂模式、简单工厂模式、工厂方法模式
今天介绍抽象模式按以下目录介绍
- 抽象工厂模式概念
- 抽象模式例子
- 适用性
- 类图
- 抽象工厂的设计和可拓展性
抽象工厂模式
抽象工厂模式很简单,比较类似工厂方法模式,他是对具有两组以上的相同结构的产品类的处理,比如,我们需要男士鞋和女士鞋、男士T恤和女士T恤、男士裤子和女士裤子、,如果采用工厂方法模式那么就需要六个工厂,显然这是一种浪费,那么为了避免这种浪费我们就有了抽象工厂模式,我们抽象出三大产品类中都有男士和女士,那么就建造一个男士工厂和女士工厂即可。具体产品再由工厂生产
下面是例子
像上面这些产品,如果采用工厂方法模式的话,会产生六个具体工厂类,会发现过于麻烦,我们需要把共同点抽象出来,这就产生了抽象工厂模式
会发现只需要一个具体工厂类就可以担负创建三组产品的责任。
当一个客户对象需要创建多个相关的层次类对象中的一个对象,但是不需要知道哪个具体的类被初始化了的时候,使用抽象工厂模式
下面贴出代码,感受一下,这里只用了shirt和shoes当作产品类
Shirt产品类
public interface Shirt {
public void describe();
}
public class ManShirt implements Shirt{
public void describe() {
System.out.println("Man shirt");
}
}
public class WomanShirt implements Shirt{
public void describe() {
System.out.println("Woman shirt");
}
}
Shoes产品类
public interface Shoes {
public void describe();
}
public class ManShoes implements Shoes{
public void describe() {
System.out.println("Man shoes");
}
}
public class WomanShoes implements Shoes{
@Override
public void describe() {
System.out.println("Woman shoes");
}
}
工厂类
public interface Creator {
public Shoes getShoes();
public Shirt getShirt();
}
public class ManCreator implements Creator{
@Override
public Shoes getShoes() {
return new ManShoes();
}
@Override
public Shirt getShirt() {
return new ManShirt();
}
}
public class WomanCreator implements Creator{
@Override
public Shoes getShoes() {
return new WomanShoes();
}
@Override
public Shirt getShirt() {
return new WomanShirt();
}
}
重点来了,客户端:
public class Client {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String gender = sc.nextLine();
String cloth = sc.nextLine();
Creator creator = null;
if(gender.equals("man"))
creator = new ManCreator();
else if(gender.equals("woman"))
creator = new WomanCreator();
if(cloth.equals("shoes")) {
Shoes shoes = creator.getShoes();
shoes.describe();
}
else if(cloth.equals("shirt")) {
Shirt shirt = creator.getShirt();
shirt.describe();
}
}
}
我们发现根据我们抽象出来的特点,分为不同的工厂,比如有个男士用品工厂,和女士用品工厂,我们进行选择的时候比如男士T恤,那么客户联系男士工厂让他们生产出T恤,这样就避免了多个工厂出现。
适用性
在以下情况可以使用抽象工厂模式
- 一个系统要独立于它的产品的创建、组合和表示时
- 一个系统要有多个产品中的一个来配置时
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时
类图
不失一般性,其类图都可以画成如下

抽象工厂模式的可拓展性
我们参照上面的标准类图,注意到工厂的具体工厂是包含两个产品ProductA和ProductB,所以此时如果新增一个ProductC那么会出现什么情况呢,我们就回去修改具体工厂乃至抽象工厂,显然此时不满足开闭原则;
类图就成下面这种情况 ,黄色代表修改的,红色时新增的
而如果我们新增一种抽象特点呢,比如男士工厂、女士工厂,我们新增一个宝宝工厂,那么只需要添加一个具体工厂类和几个具体产品类而不修改其余代码,这显然符合开闭原则。