Абстрактная фабрика
Суть паттерна
Абстрактная фабрика — это порождающий паттерн проектирования, который позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.
Чтобы понять абстрактный паттерн, вернемся к паттерну фабричный метод. Мы используем паттерн фабрики для создания нескольких объектов из одного семейства без необходимости иметь дело с процессом создания. Абстрактный фабрика похожа; разница в том, что она предоставляет конструктор для создания семейств связанных объектов. Он абстрактный, то есть не определяет конкретные классы или конструкторы.
Приведенная выше диаграмма должна помочь лучше понять концепцию. Есть «Абстрактная фабрика нездоровой пищи». Он предоставляет конструктор для создания экземпляров «Фабрики чипсов» или «Фабрики содовой». Как видите, обе фабрики разные, но взаимосвязанные. Затем эти фабрики, в свою очередь, производят различные виды продуктов, чипсы и газированные напитки.
Пример
1function Soda(name,type,price) {2 this.name = name;3 this.type = type;4 this.price = price;5 this.display = function(){6 console.log(`The ${this.type} ${this.name} costs ${this.price} dollars`)7 }8}910function Chips(name,type,price) {11 this.name = name;12 this.type = type;13 this.price = price;14 this.display = function(){15 console.log(`The ${this.type} ${this.name} costs ${this.price} dollars`)16 }17}1819function JunkFoodFactory(){20 var junkfood;21 this.createJunkFood = function(name,type,price) {22 switch (name) {23 case "chips":24 junkfood = new Chips(name,type,price);25 break;26 case "soda":27 junkfood = new Soda(name,type,price);28 break;29 default:30 junkfood = new Chips(name,type,price);31 break;32 }33 return junkfood;34 }35}363738var factory = new JunkFoodFactory();39var chips = factory.createJunkFood("chips","potato",1.50)40chips.display()4142chips = factory.createJunkFood("chips","corn",2.50)43chips.display()4445var soda = factory.createJunkFood("soda", "Energy Drink", 10)46soda.display()4748soda = factory.createJunkFood("soda", "Cola", 7)49soda.display()
В приведенном выше примере у нас есть абстрактная фабрика JunkFoodFactory
.
Конструктор-функция JunkFoodFactory
содержит метод createJunkFoodFactory
.
1this.createJunkFoodFactory = function(name,type,price) {//code...}
Он принимает следующие параметры: имя, тип и цену.
Функция содержит переменную junkfood
, используемую для хранения экземпляра нездоровой пищи, будь то чипсы или газированные напитки.
Если аргумент name
- chips
, вызывается Chips
конструктор фабрики с необходимыми параметрами для создания пакета микросхем.
1junkfood = new Chips(name,type,price);
Если аргумент name
- soda
, вызывается конструктор фабрики Soda
с необходимыми параметрами для создания банки содовой.
1junkfood = new Soda(name,type,price);
В конце концов, возвращаем экземпляр junkfood
.
Теперь посмотрим на конструкторы Chips
и Soda
.
Конструкторы Chips
и Soda
принимают имя, тип и цену параметров. Свойства экземпляра будут инициализированы переданными аргументами.
1function Soda(name,type,price) {2 this.name = name;3 this.type = type;4 this.price = price;5}67function Chips(name,type,price) {8 this.name = name;9 this.type = type;10 this.price = price;11}
Оба конструктора также содержат функцию display
. Он показывает имя, тип, а также цену созданного экземпляра.
1this.display = function(){2 console.log(`The ${this.type} ${this.name} costs ${this.price} dollars`)3}
В конце концов, все, что вам нужно сделать, это создать фабрику и вызвать на ней функцию createJunkFood
(с необходимыми аргументами), а обо всем остальном позаботятся. Вам не нужно самостоятельно создавать новые экземпляры для чипсов или газированных напитков с помощью оператора new
. Вы можете просто вызвать функцию createJunkFood
, которая решит, какую фабрику вызвать для создания необходимого продукта.
Когда использовать?
Абстрактная фабрика нужна для создания экземпляров предпочтительнее инициализации их с помощью оператора new
, поскольку конструкторы имеют ограниченный контроль над процессом, тогда как; завод будет иметь более широкие знания.
Варианты использования этого шаблона:
- приложения, требующие повторного использования или совместного использования объектов
- приложения со сложной логикой, у них есть несколько семейств связанных объектов, которые необходимо использовать вместе
- кеширование объектов
- когда процесс создания объекта должен быть защищен от клиента
Более подробнее почитать о паттерне абстрактная фабрика можно тут