-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAbstractFactory.cpp
More file actions
260 lines (214 loc) · 8.42 KB
/
AbstractFactory.cpp
File metadata and controls
260 lines (214 loc) · 8.42 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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#include <iostream>
using namespace std;
// Абстрактный класс стола
class Table {
public:
// Метод, который вызывается, когда на столе едят
virtual void eatFood() = 0;
};
// Абстрактный класс стула
class Chair {
public:
// Метод, который вызывается, когда на стуле сидят
virtual void sit() = 0;
};
// Абстрактный класс шкафа
class Cupboard {
public:
// Метод, который вызывается, когда используют шкаф
virtual void use() = 0;
};
///////////////////////////////////////////////////////
// Конкретный класс стола деревянной мебели
class WoodenTable : public Table {
public:
void eatFood() override {
cout << "Eating food on a wooden table\n";
}
};
// Конкретный класс стула деревянной мебели
class WoodenChair : public Chair {
public:
void sit() override {
cout << "Sitting on a wooden chair\n";
}
};
// Конкретный класс шкафа деревянной мебели
class WoodenCupboard : public Cupboard {
public:
void use() override {
cout << "Using a wooden cupboard\n";
}
};
// Конкретный класс стола пластиковой мебели
class PlasticTable : public Table {
public:
void eatFood() override {
cout << "Eating food on a plastic table\n";
}
};
// Конкретный класс стула пластиковой мебели
class PlasticChair : public Chair {
public:
void sit() override {
cout << "Sitting on a plastic chair\n";
}
};
// Конкретный класс шкафа пластиковой мебели
class PlasticCupboard : public Cupboard {
public:
void use() override {
cout << "Using a plastic cupboard\n";
}
};
// Конкретный класс стола металлической мебели
class MetalTable : public Table {
public:
void eatFood() override {
cout << "Eating food on a metal table\n";
}
};
// Конкретный класс стула металлической мебели
class MetalChair : public Chair {
public:
void sit() override {
cout << "Sitting on a metal chair\n";
}
};
// Конкретный класс шкафа металлической мебели
class MetalCupboard : public Cupboard {
public:
void use() override {
cout << "Using a metal cupboard\n";
}
};
///////////////////////////////////////////////////////
// Абстрактный класс для производства мебели
class FurnitureFactory {
public:
// Создает объект стола
virtual class Table* createTable() = 0;
// Создает объект стула
virtual class Chair* createChair() = 0;
// Создает объект шкафа
virtual class Cupboard* createCupboard() = 0;
};
///////////////////////////////////////////////////////
// Класс для производства деревянной мебели
class WoodenFurnitureFactory : public FurnitureFactory {
public:
// Создает объект стола деревянной мебели
Table* createTable() override {
return new WoodenTable();
}
// Создает объект стула деревянной мебели
Chair* createChair() override {
return new WoodenChair();
}
// Создает объект шкафа деревянной мебели
Cupboard* createCupboard() override {
return new WoodenCupboard();
}
};
// Класс для производства пластиковой мебели
class PlasticFurnitureFactory : public FurnitureFactory {
public:
// Создает объект стола пластиковой мебели
Table* createTable() override {
return new PlasticTable();
}
// Создает объект стула пластиковой мебели
Chair* createChair() override {
return new PlasticChair();
}
// Создает объект шкафа пластиковой мебели
Cupboard* createCupboard() override {
return new PlasticCupboard();
}
};
// Класс для производства металлической мебели
class MetalFurnitureFactory : public FurnitureFactory {
public:
// Создает объект стола металлической мебели
Table* createTable() override {
return new MetalTable();
}
// Создает объект стула металлической мебели
Chair* createChair() override {
return new MetalChair();
}
// Создает объект шкафа металлической мебели
Cupboard* createCupboard() override {
return new MetalCupboard();
}
};
void test(FurnitureFactory* factory) {
Table* table = factory->createTable();
Chair* chair = factory->createChair();
Cupboard* cupboard = factory->createCupboard();
// Используем мебель
table->eatFood();
chair->sit();
cupboard->use();
// Освобождаем память
delete table;
delete chair;
delete cupboard;
}
// Пример использования фабрик мебели
int main() {
FurnitureFactory* factory = new WoodenFurnitureFactory();
// Создаем деревянную фабрику мебели
test(factory);
// Освобождаем память
delete factory;
factory = new PlasticFurnitureFactory();
// Создаем пластиковую фабрику мебели
test(factory);
// Освобождаем память
delete factory;
}
/*
Код включает в себя определение абстрактных классов
Table, Chair и Cupboard, а также конкретных классов
WoodenTable, WoodenChair, WoodenCupboard, PlasticTable,
PlasticChair, PlasticCupboard, MetalTable, MetalChair
и MetalCupboard, которые наследуют абстрактные классы.
Также определен абстрактный класс FurnitureFactory и его
конкретные реализации WoodenFurnitureFactory,
PlasticFurnitureFactory и MetalFurnitureFactory,
которые создают объекты Table, Chair и Cupboard
соответствующих типов мебели.
Функция test использует экземпляр FurnitureFactory для
создания объектов Table, Chair и Cupboard, а затем
вызывает их методы eatFood(), sit() и use()
соответственно.
Этот код использует принцип проектирования "Абстрактная
фабрика", который позволяет создавать объекты семейства
связанных продуктов без указания их конкретных классов.
Вместо этого код работает с абстрактными классами и
интерфейсами, которые определяют общие методы для
семейства продуктов.
*/
// https://refactoring.guru/ru/design-patterns/abstract-factory
/*
Паттерн Абстрактная Фабрика(Abstract Factory) -
это паттерн проектирования, который позволяет создавать
семейства связанных объектов, не указывая их конкретные
классы.
Плюсы:
+ Обеспечивает высокий уровень абстракции и гибкость
проектирования.
+ Позволяет создавать объекты, не зависящие от конкретных
классов, что облегчает их замену.
+ Упрощает добавление новых семейств объектов в приложение.
Минусы :
- Усложняет код программы из-за необходимости создания
большого количества классов и интерфейсов.
- Увеличивает сложность программы, если в приложении нет
необходимости в использовании семейств объектов или
семейств объектов редко меняются.
- Необходимо тщательно проектировать и документировать
интерфейсы и классы, чтобы предотвратить ошибки
при работе с различными семействами объектов.
*/