设计模式:工厂与工厂方法与抽象工厂

新手上路,请多包涵

我正在从网站上阅读设计模式

在那里我读到了有关工厂、工厂方法和抽象工厂的信息,但它们太令人困惑了,定义不清楚。根据定义

工厂 - 在不向客户端公开实例化逻辑的情况下创建对象,并通过公共接口引用新创建的对象。 是工厂方法的简化版

工厂方法 - 定义一个用于创建对象的接口,但让子类决定实例化哪个类并通过公共接口引用新创建的对象。

抽象工厂 - 提供用于创建相关对象系列的接口,而无需明确指定它们的类。

我还查看了关于抽象工厂与工厂方法的其他 stackoverflow 线程,但那里绘制的 UML 图使我的理解更糟。

谁能告诉我

  1. 这三种模式有何不同?
  2. 什么时候使用哪个?
  3. 如果可能,还有与这些模式相关的任何 Java 示例吗?

原文由 Just_another_developer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 401
1 个回答

所有三种工厂类型都做同样的事情:它们是“智能构造函数”。

假设您希望能够创建两种水果:Apple 和 Orange。

工厂

工厂是“固定的”,因为您只有一个没有子类化的实现。在这种情况下,您将有一个这样的类:

 class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

用例:构造一个 Apple 或一个 Orange 有点过于复杂,无法在其中任何一个的构造函数中处理。

工厂方法

当您在一个类中进行一些通用处理,但又想改变您实际使用的水果种类时,通常会使用工厂方法。所以:

 abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }
}

…然后您可以通过在子类中实现工厂方法来重用 FruitPicker.pickFruit() 中的通用功能:

 class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

抽象工厂

抽象工厂通常用于依赖注入/策略之类的事情,当您希望能够创建需要“同类”并且具有一些公共基类的整个对象系列时。这是一个与水果相关的模糊示例。这里的用例是我们要确保我们不会不小心在 Apple 上使用 OrangePicker。只要我们从同一家工厂获得 Fruit 和 Picker,它们就会匹配。

 interface PlantFactory {

  Plant makePlant();

  Picker makePicker();

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}

原文由 Anders Johansen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题