从JDK中学习设计模式——抽象工厂模式

221 阅读3分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

概述

抽象工厂模式(Abstract Factory Pattern)是一个对象创建型模式,因此又被称为 Kit 模式

与工厂方法模式相比,抽象工厂模式中的具体工厂不再是创建一种产品,而是创建一族产品。其实为了方便理解可以认为,抽象工厂模式中的一个具体工厂负责多个具体产品的一部分,所有部分组合起来,才能构成一个完整的产品,就像流水线一样。例如:张三有两种产品,分别是水壶和斧头,这两种产品都需要抛光和喷漆。现在有两个具体的工厂,如果分别是抛光工厂和喷漆工厂,抛光工厂负责水壶和斧头的抛光,喷漆工厂负责水壶和斧头的喷漆,只有这两个工厂合作才是一个完整的产品周期,那么这种模式就是抽象工厂模式。如果两个具体的工厂分别是水壶工厂和斧头工厂,每个工厂都能独立完成各自的产品,那么这就是复杂一点的工厂方法模式。

结构

抽象工厂模式UML.png

  • Factory:抽象工厂类,声明了一组创建具体产品的方法,每个方法对应一种产品,是所有具体工厂的父类,该类供外部直接调用。

    ConcreteFactory:具体工厂类,它实现了抽象工厂中声明的一组具体产品,这些产品构成一个产品族。

    Product:抽象产品类,在 Java 中为接口或抽象类,是所有具体产品的父类,用于描述具体产品的共有属性。

    ConcreteProduct:具体产品类,它是具体工厂类所要创建的目标之一,需要实现抽象产品类所定义的抽象方法。

优点

  1. 抽象工厂符合依赖倒置原则,客户端可以很容易的更换具体工厂。
  2. 产品类符合开闭原则,当需要增加新的产品时,只需要新增产品类,而不需要修改原有的程序。

缺点

增加新的产品等级结构不符合开闭原则,此时需要对所有产品类进行修改,甚至需要修改抽象层代码,代码改动很大。

应用场景

  1. 客户端不关心具体产品的创建,将其对象的创建和使用解耦。
  2. 系统中有多个产品族,而每次只使用其中一个产品族。可以通过配置文件等方式来动态改变产品族,也可以很方便地增加新的产品族。
  3. 属于同一个产品族的产品将在一起使用,同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束。
  4. 产品等级结构稳定,设计完成之后,不会修改等级结构。

JDK 中的应用

JDK 中有很多地方使用了工厂方法模式,如:java.sqljava.util.Collection

数据库抽象工厂类UML.png