私は新しいアプリケーションを設計しており、次の問題を考えています。
背景情報
タイプ House のオブジェクトを作成するために、HouseBuilder というビルダー クラスを作成します。ビルダーは次のメソッドを提供します。
- buildRoof()、
- buildWindow(),
- buildDoor()、
- 等。、
- getHouse()。
クライアント コードでは、通常、次のようなビルダー クラスを使用します。
HouseBuilder builder = new HouseBuilder();
House house = builder.buildRoof().buildWindow().buildWindow().buildDoor().getHouse();
これは、使用されている Builder デザイン パターンの典型的な例です。
質問
クライアント コードでは、特定のタイプの家、たとえばコテージを建てる必要があります。新しいものが必要になるたびに、基本的なビルディング ブロック (上記の例のように) からコテージを構築することは、多くの不必要に重複したコードのように思えます。
したがって、新しいビルダー クラス、たとえば CottageBuilder を作成します。これにより、次のようなことが可能になります。
HouseBuilder builder = new CottageBuilder();
House house = builder.buildCottage().getHouse();
CottageBuilder を設計するための最良のアプローチが何であるかはわかりません。次の 2 つのオプションが思い浮かびます。
- CottageBuilder を HouseBuilder のサブクラスにし、buildCottage メソッド内で親のメソッドを使用します。
- CottageBuilder に HouseBuilder インスタンスを受け入れさせ、buildCottage メソッド内でそのメソッドを呼び出します (ポリモーフィックな動作を取得するために、とにかく CottageBuilder を HouseBuilder のサブクラスにするため、CottageBuilder を HouseBuilder の周りのデコレータのようなものにする必要があります)。
どちらのアプローチが優れていますか?
私が考えることができる 2 番目のアプローチの 1 つの欠点は、CottageBuilder が別の HouseBuilder インスタンスに依存する必要があり、コンストラクターで依存関係を要求するようにすることです。ただし、クライアント コードの観点からは、HouseBuilder インスタンスを CottageBuilder インスタンスに設定するのは奇妙に思えます。
私のビルダーは実際には House オブジェクトを構築するのではなく、別のドメインのオブジェクトを構築することに注意してください。私は、ターゲット ドメインを説明することで質問を汚すのではなく、この類推を作成することにしました。これは、私の意見では、元の問題に非常によく適合します。