-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFactoryMethod.cpp
More file actions
140 lines (117 loc) · 5.34 KB
/
FactoryMethod.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>
using namespace std;
// Абстрактный класс для продуктов-диалогов
class Dialog {
public:
virtual void Render() = 0;
virtual void Click() = 0;
};
// Конкретный продукт диалога для Windows
class WindowsDialog : public Dialog {
public:
void Render() override {
cout << "Отрисовка Windows-диалога" << endl;
}
void Click() override {
cout << "Клик на Windows-диалоге" << endl;
}
};
// Конкретный продукт диалога для Web
class WebDialog : public Dialog {
public:
void Render() override {
cout << "Отрисовка Web-диалога" << endl;
}
void Click() override {
cout << "Клик на Web-диалоге" << endl;
}
};
// Конкретный продукт диалога для консоли
class ConsoleDialog : public Dialog {
public:
void Render() override {
cout << "Отрисовка консольного диалога" << endl;
}
void Click() override {
cout << "Клик на консольном диалоге" << endl;
}
};
// Абстрактный класс для создания продуктов диалогов
class DialogFactory {
public:
virtual Dialog* CreateDialog() = 0;
};
// Конкретная фабрика для создания продуктов диалогов Windows
class WindowsDialogFactory : public DialogFactory {
public:
Dialog* CreateDialog() override {
return new WindowsDialog();
}
};
// Конкретная фабрика для создания продуктов диалогов Web
class WebDialogFactory : public DialogFactory {
public:
Dialog* CreateDialog() override {
return new WebDialog();
}
};
// Конкретная фабрика для создания продуктов диалогов консоли
class ConsoleDialogFactory : public DialogFactory {
public:
Dialog* CreateDialog() override {
return new ConsoleDialog();
}
};
// Клиентский код
int main() {
setlocale(0, "");
DialogFactory* factory = new WindowsDialogFactory();
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
/*
Фабричный метод — это порождающий паттерн проектирования,
который определяет общий интерфейс для создания объектов
в суперклассе, позволяя подклассам изменять тип
создаваемых объектов.
Преимущества и недостатки
+ Избавляет класс от привязки к конкретным классам
продуктов.
+ Выделяет код производства продуктов в одно место,
упрощая поддержку кода.
+ Упрощает добавление новых продуктов в программу.
+ Реализует принцип открытости/закрытости.
- Может привести к созданию больших параллельных
иерархий классов, так как для каждого класса продукта
надо создать свой подкласс создателя.
*/