<aside>
💡
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
</aside>
结构图


- 抽象产品接口(AbstractProduct)
- 定义产品的接口,可以定义多个抽象产品接口
- 可以有多种不同的具体实现
- 具体产品类(ConcreteProduct)
- 抽象工厂接口(AbstractFactory)
- 声明一组用于创建产品的方法,每个方法对应一类产品(包含创建所有类别产品的抽象方法)
- 具体工厂类(ConcreteFactory)
- 实现抽象工厂接口,负责创建一组具有特定实现的产品对象
- 为创建不同产品对象,客户端应该使用不同的具体工厂
优点与缺点
优点
- 易于交换产品系列
- 抽象工厂模式能够保证一系列相关的产品一起使用,并且在不修改客户端代码的情况下,可以方便地替换整个产品系列
- 由于具体工厂类只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同的产品配置
- 可以让具体的创建实例过程与客户端分离
- 客户端提供它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中
缺点
- 如果需要增加功能(增加具体产品类),则需要修改抽象工厂接口和所有具体工厂类,扩展性较差
解决方案
- 使用简单工厂来代替抽象工厂类
- 反射技术
- 使用反射可以利用字符串变量来指定实例化的对象,还可以从配置文件中读取变量来指定实例化的对象
- 所有使用简单工厂的地方,都可以考虑使用反射技术来解除分支判断带来的耦合
应用场景
- 抽象工厂模式适用于一系列相关或相互依赖的产品被一起创建的情况
- 典型的应用场景是使用抽象工厂模式来创建与不同数据库的连接对象。