我有以下两种使用Abstract Factory模式的方式
方法1
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是反模式吗?
答案 0 :(得分:3)
方法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