定义

提供一个创建一系列相关或者互相依赖对象的接口,而无需指定他们具体的类。

结构和说明

创建型模式-抽象工厂模式 - 图1

示例代码

  1. public class AbstractFactoryDemo {
  2. public static interface AbstractProductA {
  3. }
  4. public static class ProductA1 implements AbstractProductA {
  5. }
  6. public static class ProductA2 implements AbstractProductA {
  7. }
  8. public static interface AbstractProductB {
  9. }
  10. public static class ProductB1 implements AbstractProductB {
  11. }
  12. public static class ProductB2 implements AbstractProductB {
  13. }
  14. public static interface AbstractFactory {
  15. AbstractProductA createProductA();
  16. AbstractProductB createProductB();
  17. }
  18. public static class ConcreteFactory1 implements AbstractFactory {
  19. @Override
  20. public AbstractProductA createProductA() {
  21. return new ProductA1();
  22. }
  23. @Override
  24. public AbstractProductB createProductB() {
  25. return new ProductB1();
  26. }
  27. }
  28. public static class ConcreteFactory2 implements AbstractFactory {
  29. @Override
  30. public AbstractProductA createProductA() {
  31. return new ProductA2();
  32. }
  33. @Override
  34. public AbstractProductB createProductB() {
  35. return new ProductB2();
  36. }
  37. }
  38. public static class Client {
  39. public static void main(String[] args) {
  40. AbstractFactory factory = new ConcreteFactory1();
  41. AbstractProductA productA = factory.createProductA();
  42. AbstractProductB productB = factory.createProductB();
  43. }
  44. }
  45. }

调用顺序

创建型模式-抽象工厂模式 - 图2

优缺点

优点

  • 分离接口和实现

客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中接耦。

  • 使得切换产品簇变得容易

因为一个具体的工厂实现代表的是一个产品簇。客户端选用不同的工厂实现,就相当于是在切换不同的产品簇。

缺点

  • 不太容易扩展新的产品

如果需要给整个产品添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

  • 容易造成类层次复杂

在使用抽象工厂模式的时候,如果需要选择的层次过多,那么会造成整个类层次变得复杂。
也就是整个 抽象工厂也需要分出层次来,每一层负责一种选择,也就是一层屏蔽一种变化 ,这样就很容易造成复杂的类层次结构。

思考

本质

选择产品簇的实现。

何时选用

  • 如果希望一个系统独立于它的产品的创建、组合和表示的时候。换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候。
  • 如果一个系统要由多个产品系列中的一个配置的时候。换句话说,就是可以动态地切换产品簇的时候。
  • 如果要强调一系列相关产品的接口,以便联合使用他们的时候。

相关模式

  • 抽象工厂和工厂方法模式

这两个模式既有区别,又又联系,可以组合使用。
工厂方法模式一般是对单独的产品对象的创建,而抽象工厂模式注重产品簇对象的创建,这是它们的区别。
如果把抽象工厂创建的产品簇简化,这个产品簇就只有一个产品,那么这个时候的抽象工厂跟工厂方法是差不多的,也就是抽象工厂可以退化成工厂方法,而工厂方法又可以退化成简单工厂,这也是它们的联系。
在抽象工厂的实现中,还可以使用工厂方法来提供抽象工厂的具体实现,也就是说他们可以组合使用。

  • 抽象工厂模式和单例模式

这两个模式可以组合使用使用。
在抽象工厂模式里面,具体的工厂实现,在整个应用中,通常一个产品系列只需要一个实例就可以了,因此可以把具体的工厂实现为单例。