【Swift】 设计模式 - 抽象工厂 代码后续补充

524 阅读3分钟

这是我参与 8 月更文挑战的第 6 天,活动详情查看: 8月更文挑战 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

场景

比如,你要设计一个有关家具的系统,包括一些类,用于表示:

  • 一系列相关的家具,比如ChairSofa
  • 家具不同的变体,比如由什么现代Morden的风格等

你需要生成每件家具对象,此外,在添加新产品和新风格修改已有代码时,不能一直修改核心代码

解决方案

抽象工厂模式每件产品明确声明接口 (例如椅子、 沙发或咖啡桌),然后确保所有产品变体都继承这些接口。

比如,可以声明不同类型产品椅子、沙发、桌子等的接口。然后不同风格的椅子就需要实现椅子这个类的接口。

接下来我们需要声明抽象工厂,包含一系列不同类产品的构造方法的接口。比如createChair等。。这些方法必须返回抽象产品类型。

image.png

抽象工厂模式的优缺点

  • 优点

    • 你可以确保同一工厂生成的产品相互匹配。
    • 你可以避免客户端和具体产品代码的耦合。
    • 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
    • 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。
  • 缺点

    • 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

与其他模式的关系

  • 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式生成器模式 (更灵活但更加复杂)。
  • 生成器重点关注如何分步生成复杂对象。 抽象工厂专门用于生产一系列相关对象。 抽象工厂会马上返回产品, 生成器则允许你在获取产品前执行一些额外构造步骤。
  • 抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法。
  • 当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂来代替外观模式
  • 你可以将抽象工厂和[桥接模式]https:#)搭配使用。 如果由桥接定义的抽象只能与特定实现合作, 这一模式搭配就非常有用。 在这种情况下, 抽象工厂可以对这些关系进行封装, 并且对客户端代码隐藏其复杂性。
  • 抽象工厂、 生成器原型都可以用单例模式来实现。