通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品。
工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂,而抽象工厂模式是多个产品系列一个工厂类。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列
抽象工厂模式可以看作工厂方法模式的扩展,在一个系统要由多个产品系列中的一个来配置时,工厂方法模式无法满足,这时就可以使用抽象工厂模式。这样介绍有点晦涩,下面通过实战代码的例子很好理解。
抽象工厂模式中某具体产品有专门的具体工厂类创建,但不同于工厂方法模式,它们之间是一对多的关系,及一个具体工厂类可以创建多个具体产品类。之前的工厂方法模式,我们用的 Tea 和 Coffee 为例。但是在实际生活中,Tea 和 Coffee 都有着许多种类。下面我们通过 BlackTea 和 GreenTea 以及 Nestle 和 Latte 这个几种饮品为具体产品类,DrinksAFactory 和 DrinksBFactory 为分别可以创建 BlackTea 、Nestle 和 GreenTea 、Latte 的工厂类来简单演示抽象工厂模式。
/**
* 抽象产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:19:25
*/
public abstract class Tea {
}
/**
* 具体产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:21:19
*/
public class BlackTea extends Tea {
public BlackTea() {
System.out.println("BlackTea");
}
}
/**
* 具体产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:21:56
*/
public class GreenTea extends Tea{
public GreenTea() {
System.out.println("GreenTea");
}
}
/**
* 抽象产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:26:36
*/
public abstract class Coffee {
}
/**
* 具体产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:22:26
*/
public class Nestle extends Coffee {
public Nestle() {
System.out.println("Nestle");
}
}
/**
* 具体产品类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:23:15
*/
public class Latte extends Coffee {
public Latte() {
System.out.println("Latte");
}
}
/**
* 抽象工厂类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 08:03:13
*/
public interface DrinksFactory {
Coffee createCoffee();
Tea createTea();
}
/**
* 具体工厂类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:26:53
*/
public class DrinksAFactory implements DrinksFactory {
@Override
public Coffee createCoffee() {
return new Nestle();
}
@Override
public Tea createTea() {
return new BlackTea();
}
}
/**
* 抽象工厂类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-06 20:26:53
*/
public class DrinksBFactory implements DrinksFactory {
@Override
public Coffee createCoffee() {
return new Latte();
}
@Override
public Tea createTea() {
return new GreenTea();
}
}
/**
* 测试类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-05 18:41:14
*/
public class Client {
public static void main(String[] args) {
DrinksFactory drinksAFactory = new DrinksAFactory();
Coffee coffeeA = drinksAFactory.createCoffee();
Tea teaA = drinksAFactory.createTea();
DrinksFactory drinksBFactory = new DrinksBFactory();
Coffee coffeeB = drinksBFactory.createCoffee();
Tea teaB = drinksBFactory.createTea();
}
}
客户端执行结果:

从结果可以看出,A 工厂和 B 工厂根据同样的方法创建不同系列的实例。实际开发中, 系统中有多个产品族,但每次只使用其中的某一族产品。
例如,有的人喜欢 APPLE 品牌,有的人喜欢华为品牌。然后手机、手表、平板都打算使用同一系列,这种情况就非常符合抽象工厂模式。