【デザインパターン】Flyweight

どういうもの?

  • 一つ一つは小さいオブジェクトを大量に利用する際に、生成済みのオブジェクトできるだけ再利用する
  • 無駄なオブジェクトによるメモリ消費を抑えられる。
  • 使用する側はそんな事情を意識せずに使える。

    どんなときに使う?

  • 再利用対象のクラスが不変なクラス(immutable)であるとき

    典型的な構成要素

  • Flyweight
    • 通常の利用方法だと、多くの無駄なオブジェクトを生成され得る可能性のあるクラス
  • FlyweightFactory
    • Flyweightを生成管理する工場。
    • Flyweightのオブジェクトが必要な場合はこの工場を経由して取得する
    • 生成したFlyweightオブジェクトをプールしておいて、オブジェクトが要求された時には、プールからオブジェクトを返す。
  • Client

    コード

#include <iostream>
#include <string>
#include <map>
#include <vector>

using namespace std;

class CharFactory{
public:
  string create(string s){
    return "===="+s+"====";
  }
private:
};

class GorgeousString{
public:
  GorgeousString(const string &str){
    CharFactory factory;
    for(int i=0;i<str.length();i++){
      string s = str.substr(i,1);
      string gs;
      if(stringDB.find(s) == stringDB.end()){
    gs=factory.create(s);
    stringDB[s] = gs;
      }
      else{
    gs=stringDB[s];
      }

      gstring.push_back(gs);
    }
    cout << "DB Size:" << stringDB.size() << endl;
  }

  void show(void){
    for(int i=0;i<gstring.size();i++){
      cout << gstring[i] << endl;
    }
  }

private:
  vector<string> gstring;
  map<string,string> stringDB;
};

int main(void){
  GorgeousString gstring("AABBBCCC");
  gstring.show();
}