Абстрактный шаблон фабрики с аргументами конструктора - PullRequest
0 голосов
/ 14 марта 2020

У меня есть два следующих способа использования шаблона Абстрактной фабрики

Подход 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, хотя он больше не похож на стандартную фабрику, но, похоже, служит той же цели инкапсуляции определенных c ингредиентов, которые будут использоваться конкретным c хранилищем. Но подход 2 зависит от композиции, и мне не нужно создавать реализации для каждого региона.

Является ли подход 2 антипаттерном?

1 Ответ

3 голосов
/ 14 марта 2020

Подход 2 не является заводским паттерном, но это не делает его анти-паттерном. IngredientsFactory ничего не создает, является просто контейнером и может называться Recipe.

Ключевое отличие состоит в том, что подход 1 генерирует ингредиенты внутри фабрики, тогда как подход 2 вводит ингредиенты извне. Подход 1 позволяет магазину Chica go использовать секретный рецепт для генерации ингредиентов, тогда как подход 2 требует магазина Chica go, чтобы все знали, что это за ингредиенты.

Выбор зависит от применения, но ни то, ни другое правильно или неправильно.


Также обратите внимание, что этот код в подходе 1 не будет компилироваться:

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

Это должно быть

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