0

私は新しいアプリケーションを設計しており、次の問題を考えています。


背景情報

タイプ 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 オブジェクトを構築するのではなく、別のドメインのオブジェクトを構築することに注意してください。私は、ターゲット ドメインを説明することで質問を汚すのではなく、この類推を作成することにしました。これは、私の意見では、元の問題に非常によく適合します。

4

1 に答える 1

1

「ビルダー」は通常、例のように一連のステップでオブジェクトを構築HouseBuilderします。あなたCottageBuilderは実際にはビルダーではなく、特定のタイプの家を返す「工場」です。したがって、HouseFactoryさまざまなタイプの家を作成するための静的メソッドを持つクラスがあります。

public class HouseFactory {
  public static House createCottage() {
    HouseBuilder builder = new HouseBuilder();
    // use builder to build cottage
    return builder.getHouse();
  }

  // more methods for other types of houses
}
于 2012-08-16T07:29:03.470 に答える