1

など、BicycleProducerさまざまな実装を持つインターフェイスを作成しました。OffroadBicycleProducerFastBicycleProducer

これらの各工場は、自転車を生産するために多くのパラメータを必要とします。produceこれらのプロパティをクラスにカプセル化し、メソッドに渡したいと思います。ただし、自転車には異なるプロパティが必要です。同じものもあるかもしれませんが、これを適切に行うにはどうすればよいでしょうか。のインターフェイスにBicycleProducerは、現在、すべての共通プロパティを持つインターフェイスでproduceあるパラメーターを受け取るという名前のメソッドがあります。BicycleProducingContextそして、それを実装し、自転車の種類に基づいて必要なプロパティを追加する実装があります。そして、produceメソッドでキャストする必要があります....しかし、わかりません。なんかヤバい(そうでもないかも)気がする。

これは素晴らしいアプローチですか、それとも別の方法で行う必要がありますか?

public interface BicycleProducer {
    void produce(BicycleProducingContext context);
}

public class OffroadBicycleProducer implements BicycleProducer {

    public void produce(BicycleProducingContext context) {
        context = (OffroadBicycleProducingContext) context;
    }
}

public interface BicycleProducingContext {

    int numberOfBicycles();
    void brand(String brand);
}

public class OffroadBycycleProducingContext implements BicycleProducingContext {

    //..
}
4

1 に答える 1

1

提案されたデザインについて、2 つの点がややこしいと思います。

  1. Producer私には、工場 (つまり、クラス) はまったく必要ないように見えます。ファクトリは、コンパイル時に型がわからないオブジェクトを構築する必要がある場合に便利です。しかし、自転車の種類ごとに別々のファクトリ クラスを用意することを考えているので (たとえばOffroadBicycleProducer)、事前にどのような種類のオブジェクトを作成したいかを知っていると思います。

  2. コンテキスト クラスを使用してパラメーターの受け渡しを簡素化することは良い考えですが、自転車の種類ごとに個別のコンテキスト クラスを作成し始めると、構築するコンテキストとデータを把握しなければならないという厄介な状況に陥ります。必要です -- これがすべて揃っている場合は、中間ステップをスキップして、すぐに構築することもできますBicycle

どのような種類のオブジェクトを構築する必要があるかを事前に知っていると仮定した場合、ファクトリを使用する代わりに、ビルダー パターンまたは単純な古いコンストラクターを使用します。コンストラクターのアプローチは、次のようになります。

public abstract class Bicycle {
    private int year;
    private String color;

    public Bicycle(BicycleProducingContext context) {
        this.year = context.getYear();
        this.color = context.getColor();
    }
}

public class OffroadBicycle extends Bicycle {
    private String terrainType;

    public OffroadBicycle(BicycleProducingContext context) {
        super(context);
        this.terrainType = context.getTerrainType();
    }
}

public class FastBicycle extends Bicycle {
    private int maxSpeed;

    public FastBicycle(BicycleProducingContext context) {
        super(context);
        this.maxSpeed = context.getMaxSpeed();
    }
}

Bicycle実行時まで構築するタイプがわからない場合は、単一のファクトリで上記のアプローチを使用できます。例えば:

public class BicycleFactory {
    public static Bicycle constructBicycle(BicycleProducingContext context) {
        if (context.getBicycleType().equals("OffroadBicycle")) {
            return new OffroadBicycle(context);
        } else if (context.getBicycleType().equals("FastBicycle")) {
            return new FastBicycle(context);
        } else {
            throw new IllegalArgumentException("Encountered unrecognized Bicycle type: " + context.getBicycleType());
        }
    }
}

ユースケースを過度に単純化していないことを願っていますが、上記があなたが探しているものを達成するはずだと私には思えます。

于 2012-11-08T01:42:50.133 に答える