带有构造函数参数的抽象工厂模式
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
我有以下两种方式使用抽象工厂模式
方法一
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