【问题标题】:Why base abstract factory is needed Abstract factory pattern?为什么需要基础抽象工厂抽象工厂模式?
【发布时间】:2016-03-14 12:46:03
【问题描述】:

在抽象工厂模式中涉及的主要实体是

  1. 抽象基地工厂
  2. 每个扩展抽象基础工厂的具体工厂
  3. 客户端代码
  4. 基础产品
  5. 扩展基础产品的具体产品类

我在各种实现中看到并观察到客户端代码知道具体工厂。 根据我在各个地方看到的模式的共同定义如下

定义创建对象的接口,但让子类决定实例化哪个类。

根据我的观察,createProduct 在抽象工厂方法中被实现为抽象方法。它公开了一个非抽象的公共方法,例如getProduct,它从那里调用createProductmethod。根据具体工厂类createProduct的运行时对象,相应地调用。

即使基础抽象工厂类不存在,客户端代码也可以简单地调用具体工厂类对象的createProduct 方法,因为具体工厂类对客户端代码可见。

我觉得抽象基类只在以下情况下有用

如果我们有代码来创建具体工厂类的对象,而不是在这些对象上调用getProduct 方法的代码。实例化concrete Factory classescan 的代码 将工厂放入某个队列中,稍后可以迭代队列并 可以获取Concrete products

请提供您的宝贵意见。

【问题讨论】:

    标签: java design-patterns abstract-factory


    【解决方案1】:

    客户不应该了解任何具体的工厂。抽象工厂应该隐藏工厂实现细节,允许在不影响客户端的情况下换入和换出不同的工厂。

    那些暗示 AbstractFactory 模式的目的是产生具体工厂的答案是完全错误的。不幸的是,这种错误信息具有欺骗性的直观性,因此不正确的定义在 SO 上泛滥成灾,其中许多获得了数百人的支持。

    答案here 对 AbstractFactory 给出了很好的解释;但请注意建议重复的评论。链接线程中的答案将破坏对模式的任何理解。

    【讨论】:

    • Factory 方法和 Factory 类型枚举可用于从客户端代码中隐藏具体的工厂类,但接下来我们将遇到 if-else 或 switch 案例的问题。如果只使用简单的工厂方法,我们将使用 if-else 或 switch case 创建产品,现在我们将创建具体工厂。我知道另一种方法是使用反射,但这也不是一个很好的选择。
    • 工厂方法、简单工厂和抽象工厂是三个不同的东西。正如@Glenner003 在另一个答案中所说,Abstract Factory 可能是一个接口,其具体实现是通过 DI 注入的。
    【解决方案2】:

    抽象工厂不一定是抽象类,大多数时候它只是一个接口。

    要使用的混凝土工厂应注入 DI。这样工厂的消费者就不会知道使用的是哪一种。

    【讨论】:

    • 客户端代码中混凝土工厂的 DI 注入确实很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多