跳到主要内容

工厂方法模式

工厂方法在一个特定的创建者(Creator)父类中提供了一个创建对象的接口,但是允许子类决定实例化的类。这种模式的目的是将实例化的过程推迟到子类中,以便在提供相同接口的情况下,允许子类选择实例化的类。

工厂方法将创建产品的代码实际使用产品的代码分离。

结构

工厂方法示意图工厂方法示意图

工厂方法通常包括以下二者:

  • 产品(Product):产品是工厂方法创建的对象的接口或抽象基类。
  • 创建者(Creator):创建者是一个类,其中包含一个工厂方法,该方法返回一个产品对象。创建者的子类可以实现工厂方法以更改产品的类型。

而二者又拥有相应的实现,分别代表具体产品和具体的创建者。

应用场景

  • 当构建一个类的对象却不知道对象的实际类型时
  • 当创建对象时需要特定的逻辑,而该逻辑需要多态性时
  • 当产品可能出现继承关系,而创建者希望通过同一接口创建所有产品时
    • 例如 UI 库(创建者)和按钮(产品)之间的关系

优缺点

优点

  • 避免创建者和具体产品之间的紧密耦合。
  • 单一职责原则。创建产品的逻辑被分离到一个单独的类中,这使得代码更容易维护。
  • 开闭原则。对扩展开放,对修改关闭。可以在不更改现有代码的情况下引入新的产品类型。

缺点

  • 可能会导致代码中的类数量激增,因为每个产品都需要一个具体的创建者类。这可能会使代码更难理解。

代码示例

下面的示例展示了一个简单的有关门的工厂方法。DoorFactory 是一个抽象的创建者,它定义了一个抽象的 create_door 工厂方法来创建 Door(门)对象,并提供了一个 deliver_door 方法来定义交付门的通用流程。

IronDoorFactoryWoodenDoorFactory 是具体的创建者,它们分别实现了 create_door 方法,以创建特定类型的门(IronDoorWoodenDoor)。

Door产品接口,IronDoorWoodenDoor 是具体的产品。

客户端代码通过与 DoorFactory 交互来获取一个门对象,而无需关心具体是哪个工厂在生产,也无需知道具体创建了哪种类型的门。这使得添加新的门类型变得容易,而不会影响客户端代码。