ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Factory Method

Template Methodパターンをインスタンス生成に適応したもの。インスタンスを生成するメソッドを抽象クラスで定義し、具体的な生成部分は子クラスに任せる。
次の例では、TestFactory(工場)を作成し、createメソッドでTest(製品)のインスタンスを作成している。

// 製品クラス
class Product
{
public:
    void exec();
};

// 工場クラス
class Factory
{
public:
    Product create(String name)
    {
        Product p = createProduct(name);
        return p;
    }

protected:
    Product createProduct(String name) = 0;
};

// 具体的な製品クラス
class Test : public Product
{
private:
    String Name;

public:
    Test(String name)
    {
        Name = name;
    }

    void exec()
    {
        cout << Name;
    }
};

// 具体的な製品を生成する工場クラス
class TestFactory : public Factory
{
protected:
    Product createProduct(String name)
    {
        return new Test(name);
    }
};


void doTest()
{
    Factory factory = new TestFactory();
    Product test0 = factory.create("Test0");
    Product test1 = factory.create("Test1");
    test0.exec();
    test1.exec();
}

(このソースはイメージを表したもので、実際にはこのまま入力しても動作しない)
この例ではただ生成するだけなのであまり意味は無い。
たとえば、Factoryのcreateメソッド内で、Productを作成した後、それをリストに登録するなどの処理を書けば、子クラスがどのようなものか分からなくても処理することが出来る。
ゲームプログラムで例えてみよう。敵弾を作成し敵弾リストに登録するFactoryクラスを定義する。子クラスでは直進弾にしたり、誘導弾にしたりする。どんな敵弾になっても敵弾リストに登録する処理は書き換える必要がない。こんな感じか。
今回作った例では、Testのコンストラクタがpublicなのでnewで生成できてしまう。本来ならFactoryのcreateじゃないとインスタンスの生成ができないようにすべき。

参考文献:Java言語で学ぶデザインパターン入門
参考:
ギコ猫とFactory Methodパターン
Factory Method パターン - Wikipedia