我正在从网站上阅读设计模式
在那里我读到了有关工厂、工厂方法和抽象工厂的信息,但它们太令人困惑了,定义不清楚。根据定义
工厂 - 在不向客户端公开实例化逻辑的情况下创建对象,并通过公共接口引用新创建的对象。 是工厂方法的简化版
工厂方法 - 定义一个用于创建对象的接口,但让子类决定实例化哪个类并通过公共接口引用新创建的对象。
抽象工厂 - 提供用于创建相关对象系列的接口,而无需明确指定它们的类。
我还查看了关于抽象工厂与工厂方法的其他 stackoverflow 线程,但那里绘制的 UML 图使我的理解更糟。
谁能告诉我
- 这三种模式有何不同?
- 什么时候使用哪个?
- 如果可能,还有与这些模式相关的任何 Java 示例吗?
原文由 Just_another_developer 发布,翻译遵循 CC BY-SA 4.0 许可协议
所有三种工厂类型都做同样的事情:它们是“智能构造函数”。
假设您希望能够创建两种水果:Apple 和 Orange。
工厂
工厂是“固定的”,因为您只有一个没有子类化的实现。在这种情况下,您将有一个这样的类:
用例:构造一个 Apple 或一个 Orange 有点过于复杂,无法在其中任何一个的构造函数中处理。
工厂方法
当您在一个类中进行一些通用处理,但又想改变您实际使用的水果种类时,通常会使用工厂方法。所以:
…然后您可以通过在子类中实现工厂方法来重用
FruitPicker.pickFruit()
中的通用功能:抽象工厂
抽象工厂通常用于依赖注入/策略之类的事情,当您希望能够创建需要“同类”并且具有一些公共基类的整个对象系列时。这是一个与水果相关的模糊示例。这里的用例是我们要确保我们不会不小心在 Apple 上使用 OrangePicker。只要我们从同一家工厂获得 Fruit 和 Picker,它们就会匹配。