どういうもの?
- 一つ一つは小さいオブジェクトを大量に利用する際に、生成済みのオブジェクトできるだけ再利用する
- 無駄なオブジェクトによるメモリ消費を抑えられる。
- 使用する側はそんな事情を意識せずに使える。
どんなときに使う?
- 再利用対象のクラスが不変なクラス(immutable)であるとき
例
典型的な構成要素
- Flyweight
- 通常の利用方法だと、多くの無駄なオブジェクトを生成され得る可能性のあるクラス
- FlyweightFactory
- 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();
}