Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFactoryMethod.cpp
More file actions
Latest commit
140 lines (117 loc) · 5.34 KB
/
Copy pathFactoryMethod.cpp
File metadata and controls
140 lines (117 loc) · 5.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include<iostream>
usingnamespacestd;
// Абстрактный класс для продуктов-диалогов
classDialog {
public:
virtualvoidRender() = 0;
virtualvoidClick() = 0;
};
// Конкретный продукт диалога для Windows
classWindowsDialog : publicDialog {
public:
voidRender() override {
cout << "Отрисовка Windows-диалога" << endl;
}
voidClick() override {
cout << "Клик на Windows-диалоге" << endl;
}
};
// Конкретный продукт диалога для Web
classWebDialog : publicDialog {
public:
voidRender() override {
cout << "Отрисовка Web-диалога" << endl;
}
voidClick() override {
cout << "Клик на Web-диалоге" << endl;
}
};
// Конкретный продукт диалога для консоли
classConsoleDialog : publicDialog {
public:
voidRender() override {
cout << "Отрисовка консольного диалога" << endl;
}
voidClick() override {
cout << "Клик на консольном диалоге" << endl;
}
};
// Абстрактный класс для создания продуктов диалогов
classDialogFactory {
public:
virtual Dialog* CreateDialog() = 0;
};
// Конкретная фабрика для создания продуктов диалогов Windows
classWindowsDialogFactory : publicDialogFactory {
public:
Dialog* CreateDialog() override {
returnnewWindowsDialog();
}
};
// Конкретная фабрика для создания продуктов диалогов Web
classWebDialogFactory : publicDialogFactory {
public:
Dialog* CreateDialog() override {
returnnewWebDialog();
}
};
// Конкретная фабрика для создания продуктов диалогов консоли
classConsoleDialogFactory : publicDialogFactory {
public:
Dialog* CreateDialog() override {
returnnewConsoleDialog();
}
};
// Клиентский код
intmain() {
setlocale(0, "");
DialogFactory* factory = newWindowsDialogFactory();
Dialog* dialog = factory->CreateDialog();
dialog->Render();
dialog->Click();
delete dialog;
delete factory;
}
/*
Код содержит реализацию паттерна Фабричный метод
(Factory Method), который позволяет создавать объекты
без указания конкретного класса объекта, который будет
создан.
Классы WindowsDialog, WebDialog и ConsoleDialog - это
конкретные продукты, которые наследуются от абстрактного
класса Dialog, представляющего собой продукт-диалог.
Каждый продукт реализует методы Render() и Click(),
которые выполняют определенные действия в зависимости
от конкретной реализации продукта.
Классы WindowsDialogFactory, WebDialogFactory и
ConsoleDialogFactory - это конкретные фабрики, которые
реализуют абстрактный метод CreateDialog() для создания
продукта-диалога. Каждая фабрика создает конкретный
продукт-диалог соответствующего типа.
В клиентском коде создается экземпляр фабрики
WindowsDialogFactory, затем вызывается метод
CreateDialog(), который создает объект WindowsDialog
и возвращает указатель на него. Далее вызываются методы
Render() и Click() у объекта WindowsDialog.
Используя этот подход, можно добавлять новые
конкретные продукты и фабрики, не изменяя код клиента,
а только расширяя базовые абстрактные классы.
Это упрощает поддержку и масштабирование кода.
*/
// https://refactoring.guru/ru/design-patterns/factory-method
/*
Фабричный метод — это порождающий паттерн проектирования,
который определяет общий интерфейс для создания объектов
в суперклассе, позволяя подклассам изменять тип
создаваемых объектов.
Преимущества и недостатки
+ Избавляет класс от привязки к конкретным классам
продуктов.
+ Выделяет код производства продуктов в одно место,
упрощая поддержку кода.
+ Упрощает добавление новых продуктов в программу.
+ Реализует принцип открытости/закрытости.
- Может привести к созданию больших параллельных
иерархий классов, так как для каждого класса продукта
надо создать свой подкласс создателя.
*/