抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
抽象工厂模式的结构
抽象工厂模式包含如下角色:

1.AbstractFactory:抽象工厂
提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
2.ConcreteFactory:具体工厂
主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3.AbstractProduct:抽象产品
定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4.Product:具体产品
实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
抽象工厂模式的实现
抽象工厂模式的实现步骤,一般分为如下的5步:

1.创建抽象工厂类
创建抽象工厂类的主要作用:定义具体工厂的公共接口。
源码示例如下:
package com.mikechen.java.design.factory.abstracts.model;
/**
* 抽象工厂
*
* @author mikechen
*/
public abstract class AbstractFactory {
//创建A产品家族
public abstract AbstractProductA createProductA();
//创建B产品家族
public abstract AbstractProductB createProductB();
}
2.创建目标工厂
源码示例如下:
1)抽象工厂1
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标工厂1
*
* @author mikechen
*/
public class ConcreteFactory1 extends AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
2)抽象工厂1
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标工厂2
*
* @author mikechen
*/
public class ConcreteFactory2 extends AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
3.创建抽象产品族类
创建抽象产品族类的,定义抽象产品的公共接口。
1)抽象产品A
源码示例如下:
package com.mikechen.java.design.factory.abstracts.model;
/**
* 抽象产品A
*
* @author mikechen
*/
public abstract class AbstractProductA {
//每个产品相同方法,不同实现
public abstract void make();
}
2)抽象产品B
package com.mikechen.java.design.factory.abstracts.model;
/**
* 抽象产品B
*
* @author mikechen
*/
public abstract class AbstractProductB {
//每个产品相同方法,不同实现
public abstract void make();
}
4.创建具体产品类
创建具体产品类的主要作用:继承抽象产品类, 定义生产的具体产品。
源码示例如下:
1)目标产品A2
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标产品A1
*
* @author mikechen
*/
public class ConcreteProductA1 extends AbstractProductA {
@Override
public void make() {
System.out.println("产品A1出炉");
}
}
2)目标产品A2
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标产品A2
*
* @author mikechen
*/
public class ConcreteProductA2 extends AbstractProductA {
@Override
public void make() {
System.out.println("产品A2出炉");
}
}
3)目标产品B1
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标产品B1
*
* @author mikechen
*/
public class ConcreteProductB1 extends AbstractProductB {
@Override
public void make() {
System.out.println("产品B1出炉");
}
}
4)目标产品B2
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标产品B2
*
* @author mikechen
*/
public class ConcreteProductB2 extends AbstractProductB {
@Override
public void make() {
System.out.println("产品B2出炉");
}
}
5.创建具体工厂类
创建具体工厂类的主要作用:继承抽象工厂类,定义创建对应具体产品实例的方法。
源码示例如下:
1)目标工厂1
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标工厂1
*
* @author mikechen
*/
public class ConcreteFactory1 extends AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
2)目标工厂2
package com.mikechen.java.design.factory.abstracts.model;
/**
* 目标工厂2
*
* @author mikechen
*/
public class ConcreteFactory2 extends AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
抽象工厂模式的优缺点
1.优点
- 抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。
- 增加新的产品族很方便,无需修改已有系统,符合开闭原则。
- 所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
2.缺点
- 增加新的产品等级结构很麻烦,增加新的产品等级结构很麻烦,增加新的产品等级结构很麻烦。
- 这是因为抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。
抽象工厂模式的应用场景
使用抽象工厂模式一般要满足以下条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。