『デザインパターンとともに学ぶオブジェクト指向のこころ』を読み終えたので、改めて『増補改訂版 Java言語で学ぶデザインパターン入門』を読み返しています。
Builderパターンにおいて、ConcreteBuilderをクライアント側で用意するのはなぜでしょうか?Director内で用意してはいけないのでしょうか?
『Directorは特定のBuilderのみを扱う』という理解でいるのですが、間違いでしょうか。特定のBuilderのみを扱うのであれば、Directorの中でConcreteBuilderを用意する事も難しくない気がします。
例えば、BuilderFactory::factory(type)などとして、DirectorがConcreteBuilderを知らないままConcreteBuilderを用意する事が出来るように思います。『Builderファミリから特定のConcreteBuilderを作るための指示』は出しますが、それが具体的に何であるのかを知るわけではなく、Builderが定義しているインターフェースを実装しているオブジェクトである事だけを知っているという前提に従ったままです。
Directorの責任が増えてしまう様な気がしますが、それでもクライアント側がBuilderの存在を知る必要があるのか疑問です。クライアントは『使いたいモノを使う事が出来る』という目的をかなえられれば良い気がします。それであれば、『モノを組み立てる実際の誰か』を知る必要があるのでしょうか?また、クライアント側がそのモノを組み立てる誰かを保持するのもどことなく気持ちが悪いのです。
- コンフィギュレーションを使いたいモノを作成する(Builderを扱う)Directorに与えて、DirectorがBuilderを用意する
(実際には何かしらのファクトリがBuilder作成の責任を負う) - クライアントで使いたいモノを作成するためのBuilderをクライアントが用意して、それを扱うためのDirectorに渡す
(実際には何かしらのファクトリがBuilder作成の責任を負うかもしれない)
Builder作成の責任を誰が負うのか?Directorが(間接的にしろ)その責任を負うのは誤りなのか?
Directorはモノを作る行程について責任を負います。ConcreteBuilderの生成をDirector内部で行うようにした場合、クライアント側でモノを受け取るためにはDirectorがそのインターフェースを用意しなければなりません。モノを受け取るためのインターフェースはConcreteBuilderが用意しているはずです(これはBuilderがインターフェースを定義しているかもしれません; 静的型付け言語であればConcreteBuilder)。
さて、Directorに新たな責任が発生しそうです。モノを受け取るためのインターフェースをDirectorに用意すべきでしょうか。モノを作るインターフェースがDirector::construct()だったとして、このconstructメソッドが値を返すようにするか、専用のインターフェースを定義/実装する事になります。
Builder パターンを読んで少し理解出来た事があります。『どうやら静的型付け言語による実装のための制限がありそうだ』という事です。型の制限があるために、どこでどのような責任を持たせるかが決まる事があるようです。
さて、『Directorが作られたモノを返す責任を負う』事は誤り(適切でない)でしょうか?作られたモノを返す大本はConcreteBuilderなわけですから、ConcreteBuilderから受け取るべきでしょうか?
昨日ようやく『オブジェクト指向における再利用のためのデザインパターン』(いわゆるGoF本(の訳書))を注文したので、火曜か水曜辺りからこの辺の疑問も解消出来るかなと期待しております。
デザインパターンとしてまとめられたものが絶対の答えではないわけで、この疑問は『センスで』として片付けられてしまう事かもしれません。が、GoF本を読んでいない『デザインパターンのまた聞き状態』ではお恥ずかしながら判断出来ません。そもそも、ろくな設計が出来ない身でもあるので、経験から判断する事も出来ません。

