Flyweight Pattern
Problem
Using objects to define a system all the way down to the most specific level provides optimal flexibility, but we often find recurring, related object types at a low level. Creating and managing these objects is unacceptably expensive in terms of memory usage and performance.
Solution
Share objects to support many related objects efficiently.
Related Patterns
- Factory
- Composite
- Facade
- State
- Interpreter
Discussion
Flyweight variations are stored in the repository of the application's Factory. Flyweight is generally only useful when the object overhead in a system reaches a critical point.
Examples
Storing each graphical glyph for text is an extremely bloated way to store that information. Instead, a commonly-known code for that glyph is stored. When we need to display that again, we pull the glyph corresponding to that code from the local Factory's repository.
Code
ASCII is a Flyweight for characters. The ASCIIchar class prints the internal values as an int and as a char, to represent the table of characters with a value.
class ASCIIchar{ private: int c; char ch; public: ASCIIchar(int c){ this.c = c; ch = c; } void print(){ cout << (int)c << " " << ch << endl; } } ASCIIchar foo = new ASCIIchar(65); ASCIIchar bar = new ASCIIchar(110); int main(){ foo->print(); bar->print(); }