抽象工厂模式
定义
**抽象工厂(Abstract Factory)**
:提供一个创建一系列相关或相互依赖对象的接口
UML图
AbstractProductA和AbstractProductB
:是两个产品的抽象,它们可能有不同的实现。
ProductA1、ProductA2和ProductB1、ProductB2
:是两个抽象产品的具体分类的实现。
AbstractFactory
:是一个抽象工厂接口,它里面包含所有的产品创建的抽象方法。不同产品的创建,应该使用不同的工厂。
基本实现代码
AbstractFactory
:抽象工厂类
abstract class AbstractFactory {
abstract fun createProduct(): AbstractProduct
}
AbstractProduct
:抽象产品类
abstract class AbstractProduct {
}
ConcreteFactory
:具体工厂类,其他具体工厂的代码现是一样的,略。
class ProductA1Factory : AbstractFactory() {
override fun createProduct(): AbstractProduct {
return ProductA1()
}
}
Product
:具体的产品类,其他产品代码现是一样的,略。
class ProductA1 : AbstractProduct()
Client
:客户端
class Client {
companion object {
@JvmStatic
fun main(args: Array<String>) {
val productA1 = ProductA1Factory().createProduct()
val productA2 = ProductA2Factory().createProduct()
val productB1 = ProductB1Factory().createProduct()
val productB2 = ProductB2Factory().createProduct()
}
}
}
抽象工厂模式的优缺点
- 优点:
- 便于交换产品系列,由于具体的产品类,只需要
val factory :IFactory = ConcreteFactory()
,在应用中只需要初始化的时候出现一次即可,这使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可以使用不同的产品配置。 - 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具有的工厂的实现分离,不会出现在客户代码中。
- 便于交换产品系列,由于具体的产品类,只需要
- 缺点:在每个类中构建具体的工厂时,仍需要使用具体的工厂类来生成实例,那么有100处需要用到的话,就得在100处进行实例化,到时候修改的时候也得修改100次,十分糟糕。(可以利用抽象工厂和简单工厂的结合来进行优化)
抽象工厂模式的改进
简单工厂 + 抽象工厂:
- 核心思想:利用一个统一的工厂管理类,来将各个具体的工厂实例化的过程对客户端屏蔽,客户端只需要提供一个
key
就可以得到对应的工厂。
反射+抽象工厂:
- 核心思想:简单工厂+抽象工厂可以实现让客户端通过传入一个
key
给工厂管理类得到具体的工厂,但是在工厂管理类中,具体的工厂实例化的过程还是存在的,之后新增的话就得在里面增加判断条件的分支。利用反射,将传入具体工厂的类型、类名
进行实例化,去掉过多的判断分支。
反射+配置文件+抽象工厂
- 核心思想:上一个方式还是得客户端主动传入具体的工厂类型或类名,这一步其实可以放到一个配置文件里,只需要在配置文件中指定
key
与value
的映射,通过调用key即可拿到对应的工厂类型。将零散的传值入口统一到一个配置文件中去进行管理。
简单工厂模式、工厂方法模式、抽象工厂模式的区别
- 简单工厂模式:提供一个工厂通过条件语句产生不同的产品。
- 工厂方法模式:为每个产品提供一个专门的工厂生产。
- 抽象工厂模式:是对工厂方法模式的一种抽象。它将每个产品提出抽象产品(
Product
)、工厂提供抽象工厂(IFactory
),面对接口编程,对外只需提供一个抽象的接口就可以对所有类型的工厂进行统一的操作。