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();
}