ゲーム開発のためのオブジェクト指向(Factory)

投稿者: | 2012年5月26日

ファクトリクラス

ファクトリクラスとは、「インスタンスを生成するクラス」のことです。

メリット

  1. 仮想クラスのインスタンスが定義できる
  2. インスタンスの管理ができる
  3. インスタンスのグループ分けをすることができる

1がFactory Methodの目玉ですね。仮想クラスは通常、インスタンスを生成できませんから。

2は、例えば、エスプガルーダのように、敵を倒すと敵の弾も消える、という処理を行いたいとします。

その場合、敵をFactoryクラスにして、弾を撃つときに、そのインスタンス(Product)を内部に保持して、参照を返します。(参照保持先をBulletListとします)

そして敵が破壊された場合、その敵が保持している敵弾のインスタンス全てに消滅フラグを立てて、BulletListをイテレートして参照を消し、敵弾のインスタンスを削除します。

というように、楽にインスタンスのオールクリアができるわけですね。

3は、例えば、Factoryの実装を「連邦軍」「ジオン軍」とすると、連邦軍Factoryは、「ガンダム」「ホワイトベース」などのユニットしか作れない、ジオン軍Factoryは、「ザク」「ゲルググ」などのユニットしか作れない、というようにインスタンスの生成をグループ分けできるようになります。

実装方法

例えば、ファクトリクラスはMakeXXXToken(type)というメンバ関数を持っています。この関数は、引数で「トークンの種類」を受け取り、指定したトークンをnewして、メンバ変数のトークンリストに登録し、戻り値として「インスタンスの参照」を返します。

生成したトークンを削除する場合には、トークンのメンバ関数Destroy()を呼び出し、deleteします。

このような仕組みにすると何が嬉しいのかというと、ファクトリが存在するシーンが終了した場合に、トークンリストにトークンが残っていた場合にメモリリークとして、エラー報告が行えるからです。

もしくはトークンリストからトークンを全て削除するという、ガベージコレクタとすることも可能となります。