【设计模式】创建型模式:抽象工厂

前言

  上回在C语言中实现工厂模式,它极大地方便了对某个类进行具体实现上的拓展。但如果一个系统中需要用到许多个类,而工厂方法模式中每个工厂只创建一类具体类的对象,使用简单工厂模式将会导致系统当中的工厂类过多,制作一个系统就特别麻烦且容易出错。

问题

  现在需要实现一个家具商店系统,里面有椅子、沙发和咖啡桌这些产品,而每一种产品又有不同的艺术风格。这时需要购买n件家具的顾客就有3^n种选择。
家具产品的不同风格
  但从审美的角度来讲,一般顾客都会按照艺术风格进行家具的搭配。用简单工厂生产需要顾客进行n次选择(每件家具都需要顾客作出选择)。选择出现错误就会出现如下图的“混搭”现象。
选购家具出现“混搭”

解决方案

  这时解决这类问题就需要一个抽象工厂,包含系列中所有产品构造方法的接口。 再基于抽象工厂创建多个具体工厂类,每个具体工厂只能生产特定类别的产品。使用这种方法只需一开始设定选择工厂类别,之后顾客就无需再选择产品类别了。
抽象工厂的UML图

总结

适合应用场景

  • 一个系统有多个不同系列产品时,或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建。
  • 需要隔离产品的创建、组合和表示时。
  • 强调同一系列产品的设计一致性。
  • 当提供产品类库,只想显示其接口而不想显示具体实现时。

优点

优点
利于交换产品系列只需初始化时设定选择工厂的类别即可。
利于产品的一致性同一个应用只会使用同一系列的产品,不会出现混搭现象。
单一职责原则可以将产品生成代码抽取到同一位置, 使得代码易于维护。
开闭原则向应用程序中引入新产品变体时, 你无需修改客户端代码。

缺点

缺点
代码复杂采用该模式需要向应用中引入众多接口和类。

参考

22种设计模式—抽象工厂:https://refactoringguru.cn/design-patterns/abstract-factory
《设计模式:可复用面向对象软件的基础》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值