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

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

Builder

複雑な構造を持ったインスタンスを組み上げる。
全体を構成する各パートをそれぞれ作り、それを順番に組み上げて全体を作成するというイメージかな。
では、ゲームで考えてみよう。
敵キャラが体力、大きさ、強さの3つのパラメータから出来ているとする。

class Enemy
{
private:
    int hp;
    int size;
    int power;

public:
    void setHp(int hp) { this.hp = hp; }
    void setSize(int size) { this.size = size; }
    void setPower(int power) { this.power = power; }
};

class Builder
{
public:
    void buildHp() = 0;
    void buildSize() = 0;
    void buildPower() = 0;
};

class Enemy1Builder : public Builder
{
private:
    Enemy enemy;

public:
    Enemy1Builder() { enemy = new Enemy(); }

    void buildHp()    { enemy.setHp(100); }
    void buildSize()  { enemy.setSize(20); }
    void buildPower() { enemy.setPower(10); }

    Enemy getResult() { return enemy; }
};

class Enemy2Builder : public Builder
{
private:
    Enemy enemy;

public:
    Enemy2Builder() { enemy = new Enemy(); }

    void buildHp()    { enemy.setHp(50); }
    void buildSize()  { enemy.setSize(5); }
    void buildPower() { enemy.setPower(20); }

    Enemy getResult() { return enemy; }
};

class Director
{
private:
    Builder builder;

public:
    Director(Builder builder) { this.builder = builder; }

    void construct()
    {
        builder.buildHp();
        builder.buildSize();
        builder.buildPower();
    }
};


void doTest()
{
    Enemy1Builder enemy1builder = new Enemy1Builder();
    Enemy2Builder enemy2builder = new Enemy2Builder();

    Director director1 = new Director(enemy1builder);
    Director director2 = new Director(enemy2builder);

    director1.construct();
    director2.construct();

    Enemy enemy1 = enemy1builder.getResult();
    Enemy enemy2 = enemy2builder.getResult();
}

この例では敵インスタンスのメンバ変数を設定しているだけなのであんまり意味は無い。実際のゲームプログラムではモデルデータ、テクスチャデータの読み込みやパラメータ設定などを行うことになるだろう。
DirectorはBuilderクラスのメソッドのみを利用するようにすれば、Builderクラスを継承した何々Builderが来ても正しく動作する。こうしていろんなタイプの敵キャラを追加していくことが出来る。
しかし、Builderにどんなメソッドが必要なのか、Directorのconstruct()ではどのようにメソッドを呼べばよいのかという設計が難しそうだ。敵キャラの種類が増えるにつれて、追加修正が必要になるだろう。


※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない
参考文献:Java言語で学ぶデザインパターン入門
参考:
ギコ猫とBuilderパターン
Builder パターン - Wikipedia