« 僕はタバコが大嫌いです | トップページ | 木の回転 »

Builderパターン

今日はBuilderパターンです

さて、GOF本 を読むと、

  • 複合オブジェクトについて、その制作過程を表現形式に依存しないものにすることにより、同じ制作過程で異なる表現形式のオブジェクトを生成できるようにする。

と、ある。 複合オブジェクト ってなに?

とりあえずGOF本はまだ難しいので「Java言語で学ぶデザインパターン 」を読んでみたが、

あれー?これ、Template Methodパターンと何が違うのん?なるほど、わからん。

f:id:boxer_programmer:20100825233124p:image:left

本を読む分には、DirectorとBuilder,TextBuilder,HTMLBuilderの関係を強調しているけど

そうじゃないでしょ。その関係はTemplate MethodのキモであってBuilderのキモじゃないでしょ!

じゃあBuilderのキモってなんなのさってのがJava言語デザパタ本では不明確なので、もう一度GOF本を読んでみる。

多分この 複合オブジェクト というのがキモではないかと、俺のカンは言っている。

GOF本にケチをつけるのは畏れ多いけど、ショボプログラマの自覚を持ちつつもP105,P106の図

にケチをつけたくなりました。

P105のクラス図にBuilderからそれぞれ派生したクラスのメソッドに

GetASCIIText(),GetTeXText(),GetTextWidget()があります。派生クラスにそれぞれ

定義されているのです。いや…これ、僕的にはどう考えてもTextConverterにGetText()メソッドを追加すべきでしょ…

と思うんですが、不遜な考えでしょうか?

読み間違えているのかな、とより抽象的なP106の図を見てみる

f:id:boxer_programmer:20100825233125p:image:left

うーん。やっぱりConcreateBuilderクラスにGetResult()メソッドがあって、Builderインターフェイスにはない。

…いや、やっぱりこれはBuilderインターフェイスに持ってくるべきでしょう!!

僕は本を鵜呑みにするのはあまり意味がないと思うのだ。確かに独善的に読むのは良くないが、

経典や聖書じゃないんだから…数学の本も暗記したところで意味ないでしょ?

後から恥をかいたっていいのだ!!俺は声を大にして言う「GetResult()メソッドはBuilderに純粋仮想関数として定義すべき」だと!!

さて、自己主張は置いておいて、「適用可能性」を見てみよう。

とある。とあるので、GetResult()はインターフェイスにあるべきだと思うのです。

結論

結局のところ、Builderパターンは、それの実装によらず、クライアント側が呼び出すメソッドを組み合わせて最終的に「何か」を生成するパターンですね。

なので、「何か」をクライアントに渡すメソッドはBuilder側に必要である(この場合はGetResult)

要点:

  • メソッドを組み合わせる責任はクライアントが負う
  • Builder側は組み合わせ通りになんかしら生成する。(その生成したものをクライアントに渡されることもある)
  • 複数のBuilderがある場合にはTemplate Methodパターンも使用される

さてこれも使いどころはあるのか…と。まぁ、頭に入れておけばなんらかのヒントになるかな…。

正直あまり面白いパターンじゃないなぁ…。

|

« 僕はタバコが大嫌いです | トップページ | 木の回転 »

デザインパターン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Builderパターン:

« 僕はタバコが大嫌いです | トップページ | 木の回転 »