工厂模式中是否需要工厂方法?

时间:2019-11-11 15:51:07

标签: java factory-pattern factory-method

我试图更好地理解工厂设计模式。

我了解该模式通常包括以下内容(是否总是这样?)

Function test1(num1) As String

'    Dim MyArray As Variant
'    MyArray = Array("AJ", "A")

'OR

    Dim MyArray(0 To 1)
    MyArray(0) = "AJ"
    MyArray(1) = "A"

    If num1 >= LBound(MyArray) And num1 <= UBound(MyArray) Then
        test1 = MyArray(num1)
    Else
        test1 = "Item not here"
    End If

End Function

    Sub test()

        Dim varTest As String

        'Return the second item in the array from the function.
        varTest = test1(1)
        MsgBox varTest

        'Return the first item in the array from the function.
        varTest = test1(0)
        MsgBox varTest

        'Returns "subscript out of range" error as array is only 2 elements in size (0 and 1).
        'The error is dealt with in the function using the IF....ELSE...END IF block and returns
        '"Item not here" instead.
        varTest = test1(2)
        MsgBox varTest

    End Sub

据我了解,工厂方法的意义在于创建者可能看起来像

1. Product
2. Concrete Product
3. Creator
4. Concrete Creator

其中Public abstract class Creator public void doSomething(){ Product product= createProduct(); product.doSomethingElse(); } public abstract Product createProduct(); } 是factoryMethod。

然后,当创建具体创建者时,我们将覆盖createProduct()

如果此工厂方法仅用于创建产品,这是否意味着我们在技术上没有工厂方法,但仍遵循工厂模式?

例如,代替

Creator.createProduct()

我们做类似的事情

Public ConcreteCreator extends Creator{
  public Product createProduct(){
     return new ConcreteProduct()
  }
}

并将创建者更改为类似

Public ConcreteCreator extends Creator{
  Product product;
  public ConcreteCreator(){
    this.product = new ConcreteProduct;
  }
}

看起来这基本上与工厂模式在做同样的事情,在这里,Concreteproduct仍然负责创建自己的ConcreteProducts,只是它在构造函数中执行而不是覆盖工厂方法。

这不是唯一的选择,因为将ConcreteProducts的创建逻辑从构造函数中移出到工厂方法(即仅根据需要创建具体的产品等)会更清洁吗?还是在某些情况下,如果仅在ConcreteCreator的构造函数中创建ConcreteProducts,我们将无法保持相同的行为?

3 个答案:

答案 0 :(得分:1)

我认为令您感到困惑的问题是,Creator类中不应包含doSomething()方法。工厂类应负责创建产品,而别无其他。换句话说,工厂类不使用其自己的产品。因此,您的Creator类不是抽象工厂。

答案 1 :(得分:0)

一个示例,当您需要以某种方式(例如,在对象池或缓存中)共享对象时,构造函数将无法执行与工厂模式完全相同的操作。

另一个示例是,如果您希望创建者是可配置的,那么在某种配置的基础上,可以使用一个具体工厂代替另一个具体工厂,而无需以任何方式更改代码。

答案 2 :(得分:0)

也许我不太了解,但是如果我理解您的问题的核心是为什么要使用方法而不是构造函数来返回具体的工厂对象。

我认为这将始终视情况而定,但是方法比构造函数更灵活。构造函数的目标是构造对象,并且应该限于此。

例如,如果出于任何原因您需要在返回对象,同步或验证之前使用业务逻辑,对我来说使用构造函数就没有太大意义(应该使用构造函数构造对象而不是进行操作,保留给方法)。