-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathabstract_factory.hpp
More file actions
137 lines (120 loc) · 2.97 KB
/
abstract_factory.hpp
File metadata and controls
137 lines (120 loc) · 2.97 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
#ifndef ABSTRACT_FACTORY_HPP
#define ABSTRACT_FACTORY_HPP
#include <iostream>
#include <vector>
using namespace std;
// Абстрактные базовые классы графических примитивов
class Ellipse
{
public:
virtual void info() = 0;
virtual ~Ellipse() {}
};
class Line
{
public:
virtual void info() = 0;
virtual ~Line() {}
};
class Polygon
{
public:
virtual void info() = 0;
virtual ~Polygon() {}
};
// Классы граф. примитивов для двух разных библиотек
class EllipseA: public Ellipse
{
public:
void info() {
cout << "Ellipse from lib A" << endl;
}
};
class LineA: public Line {
public:
void info() {
cout << "Line from lib A" << endl;
}
};
class PolygonA: public Polygon {
public:
void info() {
cout << "Polygon from lib A" << endl;
}
};
class EllipseB: public Ellipse
{
public:
void info() {
cout << "Ellipse from lib B" << endl;
}
};
class LineB: public Line {
public:
void info() {
cout << "Line from lib B" << endl;
}
};
class PolygonB: public Polygon {
public:
void info() {
cout << "Polygon from lib B" << endl;
}
};
// Абстрактная фабрика для производства примитивов
class GrafFactory
{
public:
virtual Ellipse* createEllipse() = 0;
virtual Line* createLine() = 0;
virtual Polygon* createPolygon() = 0;
virtual ~GrafFactory() {}
};
// Фабрика для создания воинов Римской армии
class GrafAFactory: public GrafFactory
{
public:
Ellipse* createEllipse() {return new EllipseA; }
Line* createLine() {return new LineA; }
Polygon* createPolygon() {return new PolygonA; }
};
// Фабрика для создания воинов армии Карфагена
class GrafBFactory: public GrafFactory
{
public:
Ellipse* createEllipse() {return new EllipseB; }
Line* createLine() {return new LineB; }
Polygon* createPolygon() {return new PolygonB; }
};
// Класс, содержащий всех воинов той или иной армии
class Graf {
public:
~Graf() {
size_t i;
for(i=0; i<vi.size(); ++i) delete vi[i];
for(i=0; i<va.size(); ++i) delete va[i];
for(i=0; i<vh.size(); ++i) delete vh[i];
}
void info() {
size_t i;
for(i=0; i<vi.size(); ++i) vi[i]->info();
for(i=0; i<va.size(); ++i) va[i]->info();
for(i=0; i<vh.size(); ++i) vh[i]->info();
}
vector<Ellipse*> vi;
vector<Line*> va;
vector<Polygon*> vh;
};
// Здесь создается армия той или иной стороны
class Scene
{
public:
Graf* createGraf( GrafFactory& factory ) {
Graf* p = new Graf;
p->vi.push_back( factory.createEllipse());
p->va.push_back( factory.createLine());
p->vh.push_back( factory.createPolygon());
return p;
}
};
#endif // ABSTRACT_FACTORY_HPP