这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
概述
抽象工厂模式(Abstract Factory Pattern)是一个对象创建型模式,因此又被称为 Kit 模式。
与工厂方法模式相比,抽象工厂模式中的具体工厂不再是创建一种产品,而是创建一族产品。其实为了方便理解可以认为,抽象工厂模式中的一个具体工厂负责多个具体产品的一部分,所有部分组合起来,才能构成一个完整的产品,就像流水线一样。例如:张三有两种产品,分别是水壶和斧头,这两种产品都需要抛光和喷漆。现在有两个具体的工厂,如果分别是抛光工厂和喷漆工厂,抛光工厂负责水壶和斧头的抛光,喷漆工厂负责水壶和斧头的喷漆,只有这两个工厂合作才是一个完整的产品周期,那么这种模式就是抽象工厂模式。如果两个具体的工厂分别是水壶工厂和斧头工厂,每个工厂都能独立完成各自的产品,那么这就是复杂一点的工厂方法模式。
结构
-
Factory:抽象工厂类,声明了一组创建具体产品的方法,每个方法对应一种产品,是所有具体工厂的父类,该类供外部直接调用。
ConcreteFactory:具体工厂类,它实现了抽象工厂中声明的一组具体产品,这些产品构成一个产品族。
Product:抽象产品类,在 Java 中为接口或抽象类,是所有具体产品的父类,用于描述具体产品的共有属性。
ConcreteProduct:具体产品类,它是具体工厂类所要创建的目标之一,需要实现抽象产品类所定义的抽象方法。
优点
- 抽象工厂符合依赖倒置原则,客户端可以很容易的更换具体工厂。
- 产品类符合开闭原则,当需要增加新的产品时,只需要新增产品类,而不需要修改原有的程序。
缺点
增加新的产品等级结构不符合开闭原则,此时需要对所有产品类进行修改,甚至需要修改抽象层代码,代码改动很大。
应用场景
- 客户端不关心具体产品的创建,将其对象的创建和使用解耦。
- 系统中有多个产品族,而每次只使用其中一个产品族。可以通过配置文件等方式来动态改变产品族,也可以很方便地增加新的产品族。
- 属于同一个产品族的产品将在一起使用,同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束。
- 产品等级结构稳定,设计完成之后,不会修改等级结构。
JDK 中的应用
JDK 中有很多地方使用了工厂方法模式,如:java.sql、java.util.Collection。