带有构造函数参数的抽象工厂模式

Abstract factory pattern with constructor arguments

我有以下两种方式使用抽象工厂模式

方法一

abstract class Dough {
 def getDoughType: String
}

abstract class Sauce {
 def getSauceType: String
}

abstract class AbstractIngredientsFactory {
 def createDough: Dough
 def createSauce: Sauce
}

class ThinDough extends Dough {
  def getDoughType: String = "Thin Dough !!!"
}

class RedSauce extends Sauce {
  def getSauceType: String = "Red Sauce !!!"
}

class ChicagoStoreIngredientsFactory extends AbstractIngredientsFactory {
  def createDough: Dough = new ThinDough
  def createSauce: Sauce = new RedSauce
}

方法 2

 //no longer seems like a factory
 case class IngredientsFactory(dough: Dough, sauce: Sauce)

 // concrete instance
 val chicagoIngrediendtsFactory = new IngredientsFactory(new ThinDough, new RedSauce)

方法 2 虽然不再类似于标准工厂,但它似乎服务于封装特定成分以供特定商店使用的相同目的。 但是方法 2 取决于组合,我不需要为每个区域创建实现。

方法 2 是反模式吗?

方法 2 不是工厂模式,但这并不能使它成为反模式。 IngredientsFactory 不创建任何东西,只是一个容器,可以称为 Recipe

主要区别在于方法 1 在工厂内部生成成分,而方法 2 从外部注入成分。方法 1 允许芝加哥商店使用秘方来生成成分,而方法 2 要求芝加哥商店让每个人都知道这些成分是什么。

选择取决于应用,但没有对错之分。


另请注意,方法 1 中的这段代码无法编译:

def createDough: Dough = new ThinDough
def createSauce: Sauce = new RedSauce

应该是

val createDough: Dough = ThinDough
val createSauce: Sauce = RedSauce