"シングルユース"、Javaでのファクトリクラスの2ステップビルダー実装を実施する最も簡単な方法

こんにちはみんな:ビルダークラスを持っていますが、これは一度しか使用しないでください。たとえば、「設定」コンストラクタがあり、次に構築されるオブジェクトのタイプを指定する「to ...」メソッドがあります。

例えば

AnimalBuilder a = new AnimalBuilder("myTiger");

Animal tiger = a.toTiger(4);
//or 
Animal dog = a.toDog(4) ; 

等.....

しかし、Builderを再利用することは望ましくなく、内部的に状態を維持する(つまり、工場とは異なり、ビルダーは2段階のプロセスです)。

したがって、私は現在、それぞれの "toXXX"メソッドを前提条件でラップしています。これは、ビルダーが完了したかどうかを記録するtrue/falseビットをチェックするものです。そうであれば、IllegalStateExceptionがスローされます。

このアプローチの可能な批評:なぜビルダー(工場ではなく)を使用しているのですか?...これらのオブジェクトの構築はモジュール化され、2段階のビルダープロセスを使用して簡単に理解できるため、すべての特定のメソッドにジェネリック(最初のステップ)の入力引数をコピーします。

1)ビルダークラスが1回だけ使用されるようにする簡単な方法はありますか?おそらくそこにはFactory/Builderライブラリがあり、必要とされないボイラープレートでこれらのデザインパターンを構築するかもしれません。

2)現時点で私を回避している2段階のオブジェクトビルダーデザインパターンを実装するより良い方法はありますか?

0
ビルダーが一度しか使用されないのはなぜでしょうか?
追加された 著者 denis.solonenko,

2 答え

ボイラープレートコードのヒープを状態のために調べるべきではないので、ビルダーパターンを正しく使うつもりはないと思います。なぜあなたはビルダーを一度しか使いたくないのかもわかりません。それは私には直感的ではないようです。クラスを適切に設定した場合は、ビルダーを一度使用するのを止めるための定型コードをたくさん用意する必要はありません。例えば:

public class CarBuilder {
    //builder class
    String make;
    String model;
    String colour;
    boolean isUsed = false;

    public Car build() {
        if (isUsed) {
            throw new IllegalStateException("Builder already used!");
        }

        isUsed = true;
        return new Car(this);
    }

    public String getMake() {
        return make;
    }

    public String getModel() {
        return model;
    }

    public String getColour() {
        return colour;
    }

    public CarBuilder setMake(String make) {
        this.make = make;
        return this;
    }

    public CarBuilder setModel(String model) {
        this.model = model;
        return this;
    }

    public CarBuilder setColour(String colour) {
        this.colour = colour;
        return this;
    }
}

public class Car {
    //director class

    private final String make;
    private final String model;
    private final String colour;

    Car(CarBuilder theBuilder) {
        make = theBuilder.getMake();
        model = theBuilder.getModel();
        colour = theBuilder.getColour();
    }

    public String getMake() {
        return make;
    }

    public String getModel() {
        return model;
    }

    public String getColour() {
        return colour;
    }
}

public class Main {

    public static void main(String[] args) {
        CarBuilder subaruBuilder = new CarBuilder();
        subaruBuilder.setColour("Blue");
        subaruBuilder.setMake("Subaru");
        subaruBuilder.setModel("Impreza");
        Car subaruImpreza = subaruBuilder.build();
    }
}

上記の例を使用すると、 CarBuilder メソッドは build メソッドがチェックされているため、一度しか使用できません。私は故意に、すべての設定メソッドのチェックをしませんでした。これは、開発者があなたのエリアの開発者(またはあなたがソロの場合)を使用する開発パターンであるかのように、複数回使用しないでください。あなたがしても、それを構築しようとすると例外がスローされます。

1
追加された
これはソルトトの「ソート」ですが、私の問題に特有のものではありません。ソリューションでは、シングルステップの「ビルダー」を使用しましたが、2段階のビルドを実証していません。例:まずジェネリックカーのビルドをジェネリックargsで設定したいと思います。それから、私は実際にスバル車を作りたいと思っています。その方法は特定のargsを持っています - それはスバルに特有のものです。それにもかかわらず、単一のIllegalStateExceptionエラーのみを必要とする1ステップのビルドを例示するための+1。
追加された 著者 jayunit100,
まあ、同じ種類の車を作るために必要な10の議論があるとしましょう。つまり座席数、馬力、最高速度の4つの整数があります。同じ型の複数のintを持つと、ファクトリクラスが混乱する可能性があります。したがって、2つのステップのビルダーが読みやすくなります。基本タイプを作成してから、その後にカスタムタイプを作成します。そうすれば、メソッドごとのargsの量を減らすことができます。これを行う別の方法は、インクリメンタルに構築されたオブジェクト(つまり、Bean)を作成することです。
追加された 著者 jayunit100,
私が上に示したのは ビルダーのパターンです。私は、オブジェクトの "2ステップ"ビルドプロセスを持つための要件を完全に理解しているかどうかはわかりません。なぜジェネリックカーをセットアップして最初に作成しようとしていたオブジェクトに固有のargsを持つ具体的なオブジェクトにそのオブジェクトを「キャスト」するためにそのオブジェクトを使用するのかはわかりません。可能であれば、具体的なユースケースを教えてください。
追加された 著者 Deco,

構築中にビルダーのユーザーに強制的に1つまたは他の実装を選択させる。 この種の問題については、ステップビルダパターンを使用してください。

0
追加された