Repository navigation
Expand file tree
/
Copy pathStructural_Flyweight Design Pattern
More file actions
139 lines (123 loc) · 2.47 KB
/
Copy pathStructural_Flyweight Design Pattern
File metadata and controls
139 lines (123 loc) · 2.47 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
#include<iostream>
#include<string>
#include<map>
using namespace std;
// The 'Flyweight' abstract class
class CharacterInf
{
public:
virtual void Display(int pointSize) = 0;
protected:
char charSymbol;
int FontSize;
};
// A 'ConcreteFlyweight' class
class CharacterInfA : public CharacterInf
{
public:
CharacterInfA()
{
charSymbol = 'A';
FontSize = 120;
}
void Display(int pointSize)
{
pointSize = pointSize;
cout<<charSymbol<<" (pointsize "<<pointSize<<" )"<<endl;
}
};
// A 'ConcreteFlyweight' class
class CharacterInfB : public CharacterInf
{
public:
CharacterInfB()
{
charSymbol = 'B';
FontSize = 140;
}
void Display(int pointSize)
{
pointSize = pointSize;
cout<<charSymbol<<" (pointsize "<<pointSize<<" )"<<endl;
}
};
//C, D, E,...
// A 'ConcreteFlyweight' class
class CharacterInfZ : public CharacterInf
{
public:
CharacterInfZ()
{
charSymbol = 'Z';
FontSize = 100;
}
void Display(int pointSize)
{
pointSize = pointSize;
cout<<charSymbol<<" (pointsize "<<pointSize<<" )"<<endl;
}
};
// The 'FlyweightFactory' class
class CharacterInfFactory
{
private:
map<char, CharacterInf*> hashMap;
public:
virtual ~CharacterInfFactory()
{
while(!hashMap.empty())
{
map<char, CharacterInf*>::iterator it = hashMap.begin();
delete it->second;
hashMap.erase(it);
}
}
CharacterInf* GetCharacterObj(char key)
{
CharacterInf* CharacterInf = NULL;
if(hashMap.find(key) != hashMap.end())
{
CharacterInf = hashMap[key];
}
else
{
switch(key)
{
case 'A':
CharacterInf = new CharacterInfA();
break;
case 'B':
CharacterInf = new CharacterInfB();
break;
//...
case 'Z':
CharacterInf = new CharacterInfZ();
break;
default:
cout<<"Not Implemented"<<endl;
throw("Not Implemented");
}
hashMap[key] = CharacterInf;
}
return CharacterInf;
}
};
//The Main method
int main()
{
string document = "AAZZBBZB";
const char* chars = document.c_str();
CharacterInfFactory* factory = new CharacterInfFactory;
// extrinsic state
int pointSize = 10;
// For each CharacterInf use a flyweight object
for(size_t i = 0; i < document.length(); i++)
{
pointSize++;
CharacterInf* CharacterInf = factory->GetCharacterObj(chars[i]);
CharacterInf->Display(pointSize);
}
//Clean memory
delete factory;
return 0;
}