HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Абстрактная фабрика

Суть паттерна

Абстрактная фабрика — это порождающий паттерн проектирования, который позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.

abstract factory

Чтобы понять абстрактный паттерн, вернемся к паттерну фабричный метод. Мы используем паттерн фабрики для создания нескольких объектов из одного семейства без необходимости иметь дело с процессом создания. Абстрактный фабрика похожа; разница в том, что она предоставляет конструктор для создания семейств связанных объектов. Он абстрактный, то есть не определяет конкретные классы или конструкторы.

abstract factory example

Приведенная выше диаграмма должна помочь лучше понять концепцию. Есть «Абстрактная фабрика нездоровой пищи». Он предоставляет конструктор для создания экземпляров «Фабрики чипсов» или «Фабрики содовой». Как видите, обе фабрики разные, но взаимосвязанные. Затем эти фабрики, в свою очередь, производят различные виды продуктов, чипсы и газированные напитки.

Пример

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}
9
10function 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}
18
19function 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}
36
37
38var factory = new JunkFoodFactory();
39var chips = factory.createJunkFood("chips","potato",1.50)
40chips.display()
41
42chips = factory.createJunkFood("chips","corn",2.50)
43chips.display()
44
45var soda = factory.createJunkFood("soda", "Energy Drink", 10)
46soda.display()
47
48soda = 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}
6
7function 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, поскольку конструкторы имеют ограниченный контроль над процессом, тогда как; завод будет иметь более широкие знания.

Варианты использования этого шаблона:

  • приложения, требующие повторного использования или совместного использования объектов
  • приложения со сложной логикой, у них есть несколько семейств связанных объектов, которые необходимо использовать вместе
  • кеширование объектов
  • когда процесс создания объекта должен быть защищен от клиента

Более подробнее почитать о паттерне абстрактная фабрика можно тут

Hello