デザインパターンを覚えたい (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を使うと
違う形式のメッセージを
うまい具合に
作れちゃったり
するのです
# 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も同じかぁ。