« Abstruct Factory | トップページ | フェルマーの最終定理… »

FlyWeight

ついでにFlyweight。いやぁ、馴染み深いコトバです。なぜなら僕がフライ級ボクサーだからですが…そんなことはどーでもいい。

えーと、まぁメモリとかロード時間とかいろいろ節約するためのパターン。もう適当な実装書いたほうが早いんで書きます。
#include<map>
using namespace std;

class Loader
{
private:
  map<string,char*> m_map;
public:
  void* load(string filename)
  {
   map<string,char*>::iterator it = m_map.find(filename);
   if( it != m_map.end() ){//既にロード済
    return it->second;//ロードせずポインタを返す
   }
   else{//新規ロード
    fopenだのなんだの...
    char* buf = freadだのなんだの...
    m_map.insert(make_pair(filename,buf) );//新規データを登録
    return buf;
   }
  }
};

…まぁサンプルなんで解放とかの問題なんて気にすんな!要は上のようにして余計なメモリやファイルアクセスをしないようにするってことだね!!ただこのままだとどんどんたまっていってバッドアロック例外になるはずなんで、それは各自考えてくれ!!まぁ参照カウンタつきスマートポインタでも実装してくれたまえ。

それができる人はFlyweightくらい知ってるって?まぁ、そうかもね。この実装だとマップから削除するタイミングが意外と難しいんじゃないかな。上の例ではナマポインタだけど、IsAliveだのIsValidだのチェックできるようにして、毎フレ削除更新かけるのもありだと思うけど。

|

« Abstruct Factory | トップページ | フェルマーの最終定理… »

デザインパターン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: FlyWeight:

« Abstruct Factory | トップページ | フェルマーの最終定理… »