スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Template Factoryクラスを制作してみた

ゲームには、 テクスチャ音楽、 Xファイルなど、
様々な資源がありますよね。

で、それを管理するクラスを全て作ろうとすると、
-------------------
・TextureFactory
・SoundFactory
・XFileFactory
    :

-------------------

まぁ、こんな感じでクラスの数が増大してしまうので、
テンプレートにしようと思いました。


しかし、困ったのが資源の解放の部分。
---------------------------------------------------------------------
Factory< Texture >* pt1 = Factory< Texture >::getInstance();
Factory< XFile >* pt2 = Factory< XFile >::getInstance();
Factory< Sound >* pt3 = Factory< Sound >::getInstance();

---------------------------------------------------------------------
生成の部分はこんな感じで、××型のFactoryクラスとして生成するのですが、

プログラムが終了する際に、
何型のFactoryクラスを生成したか分からないんですよ。
TextureやSound を生成したかもしれないし、何も生成してないかもしれない)


結局、安全の為には
生成する可能性のある××型のFactoryクラスを全てDestroy()する羽目になるので、
かえって面倒くさい事になりました。
注:破棄しなかった時に待っているのはメモリリークです。
※Destroy()は、Singletonを破棄する為の 自作した関数。

-------------------------------------------------------------
Factory< Texture >* pt1 = Factory< Texture >::getInstance();
Factory< XFile >* pt2 = Factory< XFile >::getInstance();
Factory< Sound >* pt3 = Factory< Sound >::getInstance();
pt1->Destroy();
pt2->Destroy();
pt3->Destroy();

-------------------------------------------------------------
↑生成したかもしれない××型のFactoryクラスを、
 プログラムの最後に 全て破棄して行く図。

明らかに駄目です。
で、その後どうしたかというと、Factoryクラスを登録する
Factory Managerクラスを作りました。

【参考画像】
TemplateFactory.jpg

※Factoryクラスは、SingletonクラスとFactoryBaseクラスを多重継承。
あとFactoryManagerクラス内のatd::vectorstd::vectorです。 ミスりました。


FactoryManagerクラスは、
生成した××型のFactoryクラスのポインタをvector配列で所持しておき、デストラクタで
vector配列の全てのポインタに対して 破棄関数(AllDelete())を呼び出します。

よって、どんな××型のFactoryクラスを生成したとしても、
-------------------------------------------------------------
FactoryManager* pt = FactoryManager::getInstance();
pt->Destroy();

-------------------------------------------------------------
これで全て消えます。

あと、FactoryManagerクラスに Factoryクラスを登録するタイミングは
Factoryクラスのコンストラクタが呼ばれた時です。

FactoryクラスはSingletonなので、
コンストラクタが呼び出されるのは初めの1回のみです。

よって、上手い具合にFactoryManagerクラスに重複する事なく登録されます。


Factory< Texture >* pt1 = Factory< Texture >::getInstance(); //登録される
Factory< Texture >* pt2 = Factory< Texture >::getInstance(); //登録されない
Factory< XFile >* pt3 = Factory< XFile >::getInstance(); //登録される
Factory< Sound >* pt4 = Factory< Sound >::getInstance(); //登録される
Factory< Sound >* pt5 = Factory< Sound >::getInstance(); //登録されない


FactoryManagerの、fListの中身

fList[0] = Factory< Texture >*
fList[1] = Factory< XFile >*
fList[2] = Factory< Sound >*


テンプレートを使ったり、多重継承したりして なんか訳が分からなくなってますが
【参考画像】
Factory.jpg

↑複雑になってきている図

一応、コレで開発を進めていこうと思います! (`・ω・´)
(まだ、ポインタをCOMポインタにしたりなど改善の余地はあります)
COMポインタ・・・参照数計測ポインタ
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。