web-dev-qa-db-ja.com

ビルダーとファクトリーパターンを混ぜることは良い考えですか?

ビルダーパターンを使用してCarconstructedオブジェクトがあります。問題は多くのコードの冗長性でした。

_    Car.Builder builder = new Car.Builder("Mercedes");
    builder.numDoors(carConfig.getNumDoors()
    builder.engineType(carConfig.getEngineType())
    builder.isManual(isManual)
    builder.build())

    Car.Builder builder = new Car.Builder("BMW");
    builder.numDoors(carConfig.getNumDoors()
    builder.engineType(carConfig.getEngineType())
    builder.isManual(isManual)
    builder.build())

    Car.Builder builder = new Car.Builder("FlyingCar");
    builder.numDoors(carConfig.getNumDoors()
    builder.engineType(carConfig.getEngineType())
    builder.wing(TypeName)
    builder.build())
_

そこで、ファクトリーパターンを使用してコードを整理するアイデアを考えました。以下のファクトリーを使えば、簡単にCarを作成できます。

_Car mercedes = CarFactory.createNonFlyingCar("Mercedes");

Car bmw = CarFactory.createNonFlyingCar("BMW");

Car flyCar = CarFactory.createFlyingCar("FlyingCarBrand");
_

_public class CarFactory {

    // brand can be BMW or Mercedes or Audi etc.
    public static Car createNonFlyingCar(String brand, CarConfiguration carConfig, Engine engine) {
        Car.Builder builder = new Car.Builder(brand);
        append(builder, carConfig.getNumDoors(), carConfig.getEngineType(), engine.isManual()).build();
    }

    public static Car createFlyingCar(CarConfiguration carConfig, Wings wings) {
        Car.Builder builder = new Car.Builder("NewFlyingCar");
        append(builder, carConfig.getNumDoors(), carConfig.getEngineType()).wings(wing.getType()).build(); // added extra 'wings' method here.
    }

    // overload append.
    private static void append(
        Car.Builder builder,
        int numDoors,
        Sting engineType,
        boolean isManual;
    )
    {
        return append(builder, numDoors, engineType).isManual(isManual);

    }

    private static void append(
        Car.Builder builder,
        int numdoors,
        String engineTye
    )
    {
        return builder.numdoors(numdoors).engineType(engineTyoe);
    }

}
_
  1. 私がファクトリーで行ったことの1つは、appendメソッドのオーバーロードでした。共通のフィールドが含まれる場合、それらを使用しました。例:numdoorsenginetypeは、飛行車と非飛行車の間で共有されました。そのため、追加のパラメーターを使用して追加によって呼び出されるappend(numdoors, engineType)を作成しました。

  2. 次に、空飛ぶ車に固有のwingが追加されませんでした。

これは既知のパターンですか?良い ?悪い?なぜ ?

4
JavaDeveloper

工場は本当に抽象化と多態性に関係しています。具体的な実装を指定せずに、インターフェースまたは抽象クラスのインスタンスを作成します。この場合、具体的なクラスCarは1つだけです。

したがって、両方のバリアントはビルダーであり、最初のバリアントはより明確になっています。 2つ目は、ファクトリと呼んでいるものですが、意図を伝えていません(何をしているかを理解するために、徹底的に分析する必要があります)。私はそれがまったく好きではありません、それはいくつかを非常に単純な複雑にします。

なぜインスタンス化された新しいCarからビルダーをスポーンするのですか?奇妙に思えますが、ビルダーはCarをインスタンス化する必要があり、逆ではありません。

これから。あなたの車にデフォルトのパラメーターのないコンストラクターがある場合、なぜビルダーさえ持っているのですか? Carを新しくして、carConfigからのプロパティを設定できますか?ビルダーは、保証、デフォルト、または自動車の構築方法に関する完全なロジックを提供していないようです。

Wingプロパティを持つFlyingCarクラスの導入を検討することができます。そうすると、パターンがより意味を持ち始めます。ビルダーは、FlyingCarなどを構築する場合にのみ、翼構成オプションを公開できます。

2
Joppe