> 技术文档 > c++注意点(14)----工厂、抽象工厂、生成器的对比

c++注意点(14)----工厂、抽象工厂、生成器的对比

        简单的说一下我的理解。

工厂

        工厂方法是“同一类产品的不同实现”。比如之前文章中提及的游戏角色。他们都是角色,区别在于一个是法师,一个是战士等等。再换个例子:

  • 抽象产品:仅 \"空调\"(一类产品)
  • 具体工厂 1:格力空调工厂(只生产格力空调)
  • 具体工厂 2:美的空调工厂(只生产美的空调)
  • 具体工厂 3:海尔空调工厂(只生产海尔空调)
  • 核心:所有工厂只生产 \"空调\" 这一种产品,区别仅在于品牌(实现方式)

在嵌入式中,比方说,现在有oled屏幕驱动。它可以是spi驱动,可以是i2s驱动,可以是别的再来驱动。这些都是对于屏幕来说的。

抽象工厂

        抽象工厂是多个产品族,如果说工厂是针对同一种产品的不同品牌,那么抽象工厂就是多个品牌下,每个品牌都有着自己的不同产品。比如说不同品牌的家电套装:

  • 抽象产品:冰箱、洗衣机、空调(三类产品)
  • 具体工厂 1(海尔套装):海尔冰箱 + 海尔洗衣机 + 海尔空调(配套,可智能互联)
  • 具体工厂 2(美的套装):美的冰箱 + 美的洗衣机 + 美的空调(配套,可智能互联)
  • 核心:选一个工厂,得到一整套兼容的产品,不能混着选(不会出现 \"海尔冰箱 + 美的洗衣机\" 的组合,因为可能不兼容)

但是实际上这些配置还是自己在代码中规定的。你可以强制说,海尔冰箱+美的洗衣机+海尔空调是工厂1。完全没有问题。

在嵌入式中,这个可以举例:你现在有屏幕驱动+触摸芯片驱动。那么可以规定:品牌是方案。产品就是SPI 接口的 OLED 屏幕驱动、SPI 接口的触摸芯片驱动、I2C 接口的 OLED 屏幕驱动、I2C 接口的触摸芯片驱动。

  • 方案 1(SPI 组合)

    • SPI 接口的 OLED 屏幕驱动
    • SPI 接口的触摸芯片驱动
  • 方案 2(I2C 组合)

    • I2C 接口的 OLED 屏幕驱动
    • I2C 接口的触摸芯片驱动

        这时候抽象工厂模式就派上用场了,它能保证同一方案中的屏幕和触摸芯片通信方式兼容。

生成器

        生成器更像是提前设定好的参数模板。众多的参数需要初始化,而需求里我并不需要对方有太灵活的配置,有几个模式就足够了。比如app里边,有黑夜模式,白天模式。我这些对于ui的参数,比如颜色都已经设定好了。用户选择白天,那么我就给白天的模板参数。

        又或者电车的模式。有急速模式,平和模式。这些对应着不同电机的配置。我提前设定好,那么用户选择哪个,我就给上哪一个配置。