Порождающие шаблоны / Абстрактная фабрика / Фабрика пиццы
Каждая пицца условно состоит из нескольких типов ингредиентов:
- какое-то мясо (бекон, колбаса, курочка, сосиски, рыба)
- какой-то сыр (моцарелла, пармезан, чеддер, веганский)
- какой-то соус (томатный, горчичный, сырный, фирменный)
- какое-то дополнение (помидоры, маслины, грибы, ананасы)
Например, пицца Пепперони выглядит так:
- мясо - колбаса пепперони
- сыр - моцарелла
- соус - фирменный
- дополнение - нет
А вот пицца Грибное ассорти:
- мясо - нет
- сыр - веганский
- соус - горчичный
- дополнение - грибы
Каждую группу продуктов можно представить в виде отдельного абстрактного класса (или интерфейса), от которого наследуют конкретные продукты.
-
Абстрактный класс
Meat
(Мясо)- Класс
PepperoniMeat
(Пепперони) - Класс
ChickenMeat
(Курица)
- Класс
-
Абстрактный класс
Sauce
(Соус)- Класс
MustardSauce
(Горчичный) - Класс
FirmSauce
(Фирменный)
- Класс
-
Абстрактный класс
Cheeze
(Сыр)- Класс
MozarellaCheeze
(Моцарелла) - Класс
VeganCheeze
(Веганский)
- Класс
-
Абстрактный класс
Addition
(Дополнение)- Класс
MushroomsAddition
(Грибы) - Класс
PineappleAddition
(Ананасы)
- Класс
Реализация единого интерфейса облегчает работу с продуктами каждой группы, ведь к PepperoniMeat
и ChickenMeat
при необходимости можно обратиться сходным образом.
Каждую конкретную пиццу создает конкретная фабрика (PepperoniPizzaFactory
, PepperoniPizzaFactory
). Необходимо проконтролироватЬ, чтобы каждая из этих фабрик набрала все необходимые для пиццы типы продуктов. Для этого создается AbstractPizzaFactory
(интерфейс или абстрактный класс).
Абстрактная фабрика объявляет методы
createMeat()
,createSauce()
,createCheeze()
,createAddition()
createDough()
.
Но конкретную реализацию она оставляет для конкретных фабрик. Таким образом, PepperoniPizzaFactory
, наследующая от AbstractPizzaFactory ПиццаФабрики
, не забудет создать мясо для пиццы, но право выбора этого мяса остается за ней.
Организация работы фабрик: index.js
Команда для запуска кода
npm run abstractFactory:pizza