4

「部分的に」変更可能なオブジェクト、つまりオブジェクトのプロパティの一部が可変であるオブジェクトを作成するときに、ビルダーを使用することが正しいアプローチであるかどうかを判断するのに苦労しています。

IGlassこのインターフェースの実装を考えてみましょう。オブジェクトの作成後に変更できる 1 つの最後の必須パラメータと 1 つのオプション パラメータ:

public class SimpleGlass implements IGlass {

    // Mandatory.
    private final int size;

    // Optional.
    private boolean isEmpty;

    private SimpleGlass(SimpleGlassBuilder builder) {
        size = builder.getSize();
        isEmpty = builder.isEmpty();
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return isEmpty;
    }

    @Override
    public void setEmpty(boolean isEmpty) {
        this.isEmpty = isEmpty;
    }

    public static class SimpleGlassBuilder {

        // Mandatory.
        private final int size;

        // Optional.
        private boolean isEmpty = false;

        public SimpleGlassBuilder(int size) {
            this.size = size;
        }

        public SimpleGlassBuilder setEmpty(boolean isEmpty) {
            this.isEmpty = isEmpty;
            return this;
        }

        public IGlass build() {
            return new SimpleGlass(this);
        }

        public int getSize() {
            return size;
        }

        public boolean isEmpty() {
            return isEmpty;
        }
    }
}

そのため、ビルダーは可変オブジェクトを作成しますが、プログラミングの文献でビルダーが言及される場合は常に、それは不変オブジェクトに関するものです。

このような場合、ビルダーを使用しても大丈夫ですか?

4

2 に答える 2

8

Builder は、多くのプロパティを持つクラスに使用され、そのほとんどはオプションで指定できます。100 万のコンストラクターや 1 つのひどいコンストラクターを使用するのではなく、ビルダーを使用して、必要なものだけを指定します。

new GlassBuilder(16_OZ).withHandle().withLogo(logo).build()

// instead of
new Glass(16_OZ, 
            /* handle? */ true, 
            /* chipped? */ false, 
            /* monogram? */ null, 
            /* something else? */ null, 
            logo);

可変性は最終的には優れています。なぜなら、可変性は優れているからです。ただし、実際には、Builder によって作業が楽になったかどうかには影響しません。

于 2012-12-27T20:56:32.570 に答える
1

IGlass 実装クラスに「空の」プロパティを残しますが、ビルダーからは削除します。値を設定する場所が多すぎます。さらに、ビルダーで設定すると、その時点以降に作成された IGlass インスタンスにのみ適用され、「setEmpty()」メソッドが呼び出されるまでのみ適用されるため、問題が混乱します。

それらをビルドしてから、新しくビルドされたオブジェクト インスタンスに「空」プロパティを設定することをお勧めします。

デザインパターンの目的は、物事を話しやすく理解しやすくすることです。ビルダーまたはインスタンスが「空の」プロパティを設定しているかどうかという追加の懸念を追加することにより、物事はそれほど簡単ではなくなりました。

于 2012-12-27T20:56:09.187 に答える