flyweight pattern in C++

```
#include <iostream>
using namespace std;

class Gazillion
{
public:
    Gazillion(int value_one) {
        m_value_one = value_one;
    }
    ~Gazillion() { }
    void report(int value_two) {
        cout << m_value_one << value_two << ' ';
    }
private:
    int m_value_one;
};

class Factory
{
public:
    static Gazillion *get_fly(int i) {
        if (!s_pool[i])
            s_pool[i] = new Gazillion(i);
        return s_pool[i];
    }
    static void clean_up() {
        for (int i = 0; i < X; ++i)
            if (s_pool[i])
                delete s_pool[i];
    }
    static int X, Y;
private:
    static Gazillion *s_pool[];
};

int Factory::X = 6, Factory::Y = 10;
Gazillion *Factory::s_pool[] = {
  0, 0, 0, 0, 0, 0
};

int main()
{
  for (int i = 0; i < Factory::X; ++i) {
    for (int j = 0; j < Factory::Y; ++j)
      Factory::get_fly(i)->report(j);
    cout << '\n';
  }
  Factory::clean_up();
}
```