我正在从网站上阅读设计模式
在那里我读到了有关Factory,Factory方法和Abstract工厂的信息,但是它们是如此混乱,在定义上还不清楚。根据定义
工厂-在不将实例化逻辑暴露给客户端的情况下创建对象,并通过公共接口引用新创建的对象。是Factory Method的简化版本
工厂方法-定义用于创建对象的接口,但让子类决定要实例化的类,并通过通用接口引用新创建的对象。
抽象工厂-提供用于创建相关对象族的接口,而无需显式指定其类。
我还查看了有关抽象工厂与工厂方法的其他stackoverflow线程,但是在那里绘制的UML图使我的理解更糟。
谁能告诉我
所有这三种Factory类型都执行相同的操作:它们是“智能构造函数”。
假设你希望能够创建两种水果:Apple和Orange。
厂 Factory是“固定的”,因为你只有一个实现,没有子类。在这种情况下,你将拥有一个像这样的类:
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。只要我们从同一家工厂获得水果和捡拾器,它们就会匹配。
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(); } }