デザインパターンを覚えたい (Builder)

Builderパターン

作成に必要なメソッドまとめたBuilderクラスを用いて決められたものをDirectorクラスのメソッドとして作成するパターン。
Template Methodパターンとよく似ているが、

Teplate Method スーパークラスで呼び出し元メソッドを定義
Builder Directorクラスという外部クラスにて呼び出し元メソッドを定義

のように、実際の処理を行うクラスと組み合わせるクラスを切り離してるところが違う。
Builderクラスのポイントは、

  • 組み合わせるクラスと実際に動作が実装されているクラスが別々なので、拡張しやすい

ってことでいいのかな?そうするとTemplate Methodとの使い分けはどうするのかいまいちわからん。

実装するべ。今回はC++で。
http://dl.dropbox.com/u/7810000/code/design_pattern/builder.zip

実行、ビルドは例のごとくomakeを使用。HTMLはテキトーです。

$ unzip builder.zip
$ cd builder
$ omake build
$ ./builder_test text

                              • -
Builder Test
                              • -

Builderを使うと
違う形式のメッセージを
うまい具合に
作れちゃったり
するのです

    • -

2012/03/25 created by yano-htn
$ ./builder_test html


<\h2>Builder Test<\/h2>

Builderを使うと

違う形式のメッセージを

うまい具合に

作れちゃったり

するのです



2012/03/25 created by yano-htn

# h2はそのまま書くとタグとして認識されちゃうみたいなのでバックスラッシュいれてます。

コードのポイントはDirectorクラスですかね。

class Director {
private:
    Builder* builder;

public:
    Director(Builder* builder) 
        : builder(builder) {}

    void createMessage() {
        builder->title("Builder Test");
        builder->body("Builderを使うと\n違う形式のメッセージを\nうまい具合に\n作れちゃったり\nするのです");
        builder->foot("2012/03/25 created by yano-htn");
    }
};

Builder使ってメッセージを作成しているけども、実際になんのBuilderが使われるかはDirectorは気にしてない。ただBuilderクラスで定義されている共有メソッドを読んでるだけ。
Builderの切り替えはmain関数の中にあります。

    // Builderの選択
    Builder* builder = NULL;
    if (mode == "text") {
        builder = new TextBuilder();
    } else if (mode == "html") {
        builder = new HTMLBuilder();
    }

    if (builder == NULL) {
        std::cout << "ERROR : unknown mode[" << mode << "]" << std::endl;
    }

    // 選択したBuilderを用いてDirectorを呼び出す
    Director director = Director(builder);
    director.createMessage();

しかし使う側でBuilderの実装クラスを宣言するのはいいのかね。まあ、そこはTemplate Methodも同じかぁ。