【问题标题】:Applicability for the Factory Method Pattern工厂方法模式的适用性
【发布时间】:2020-09-10 04:21:06
【问题描述】:

我对工厂方法模式感到困惑。

以下代码来自“https://www.oodesign.com/factory-method-pattern.html”

public interface Product { � }

public abstract class Creator 
{
    public void anOperation() 
    {
        Product product = factoryMethod();
    }
    
    protected abstract Product factoryMethod();
}

public class ConcreteProduct implements Product { � }

public class ConcreteCreator extends Creator 
{
    protected Product factoryMethod() 
    {
        return new ConcreteProduct();
    }
}

public class Client 
{
    public static void main( String arg[] ) 
    {
        Creator creator = new ConcreteCreator();
        creator.anOperation();
    }
}

这是我感到困惑的地方:

Creator creator = new ConcreteCreator();

在网站中,我们在两种情况下应用这种模式

  1. 当一个类无法预测它应该创建的对象的类型时
  2. 当一个类希望其子类成为特定新创建对象类型的子类时

但在客户端代码中,我们将“新”关键字与 ConcreteCreator 放在一起(我知道这是具体产品的具体工厂)。

这不是说客户端完全知道他/她需要创建什么类型的对象吗?

谁能帮帮我?

【问题讨论】:

  • 是的,客户知道他想要创建的具体类型(应该在代码中的某个地方做出这个决定)。接口Creator 是一般应如何创建产品的合同。
  • 从那时起,如果我们在具体创建者中更改一些代码,例如我们要求客户端在这里放一个参数,我们仍然需要更改客户端代码。那么在我们的程序中使用这种模式和只使用'new'关键字有什么区别呢?因为看起来使用这种模式没有任何优势......

标签: design-patterns factory-method


【解决方案1】:

在工厂方法模式中,Client 的作用是为抽象的Creator 提供一个具体的Product

当抽象 Creator 存在于第三方库中并且每个 Client 都需要通过实现自己的子类来提供 Product 时,这是最有意义的。在这种情况下,Client 正在实现一个它不拥有的抽象。

如果需要创建多个子类(即多个 Products),即使 Client 拥有抽象,工厂方法也很有用。

Client 拥有抽象并且只有一个Product 时,工厂方法没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多