前言
上回在C语言中实现工厂模式,它极大地方便了对某个类进行具体实现上的拓展。但如果一个系统中需要用到许多个类,而工厂方法模式中每个工厂只创建一类具体类的对象,使用简单工厂模式将会导致系统当中的工厂类过多,制作一个系统就特别麻烦且容易出错。
问题
现在需要实现一个家具商店系统,里面有椅子、沙发和咖啡桌这些产品,而每一种产品又有不同的艺术风格。这时需要购买n件家具的顾客就有3^n种选择。
家具产品的不同风格
但从审美的角度来讲,一般顾客都会按照艺术风格进行家具的搭配。用简单工厂生产需要顾客进行n次选择(每件家具都需要顾客作出选择)。选择出现错误就会出现如下图的“混搭”现象。
选购家具出现“混搭”
解决方案
这时解决这类问题就需要一个抽象工厂,包含系列中所有产品构造方法的接口。 再基于抽象工厂创建多个具体工厂类,每个具体工厂只能生产特定类别的产品。使用这种方法只需一开始设定选择工厂类别,之后顾客就无需再选择产品类别了。
抽象工厂的UML图
总结
适合应用场景
- 一个系统有多个不同系列产品时,或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建。
- 需要隔离产品的创建、组合和表示时。
- 强调同一系列产品的设计一致性。
- 当提供产品类库,只想显示其接口而不想显示具体实现时。
优点
优点 | |
---|---|
利于交换产品系列 | 只需初始化时设定选择工厂的类别即可。 |
利于产品的一致性 | 同一个应用只会使用同一系列的产品,不会出现混搭现象。 |
单一职责原则 | 可以将产品生成代码抽取到同一位置, 使得代码易于维护。 |
开闭原则 | 向应用程序中引入新产品变体时, 你无需修改客户端代码。 |
缺点
缺点 | |
---|---|
代码复杂 | 采用该模式需要向应用中引入众多接口和类。 |
参考
22种设计模式—抽象工厂:https://refactoringguru.cn/design-patterns/abstract-factory
《设计模式:可复用面向对象软件的基础》