1

コンストラクターを持つクラスがあり、それぞれに 2 つのパラメーターがあるとします。たとえば、5 つの型があり、そのうちの 2 つを最初のパラメーターとして、3 つを 2 番目のパラメーターとして渡すことができます。

タイプが A、B、C、D、E であるとします。基本的に私はこのようなものを持っています:

public SomeClass(A,C) {}
public SomeClass(A,D) {}
public SomeClass(A,E) {}

public SomeClass(B,C) {}
public SomeClass(B,D) {}
public SomeClass(B,E) {}

ご覧のとおり、これらの型のすべての可能な組み合わせがあり、標準のビルダー パターンのようにオプションのパラメーターはありません。

コンストラクターの数を減らすにはどうすればよいですか? 私を助けるパターンはありますか?

編集

A を指定した場合は B を指定できず、C を指定した場合は D または E を指定できないため、標準ビルダーは使用できません。

4

3 に答える 3

2

制限されたビルダー パターンを作成できます。

class MyBuilder {

    public MyBuilder(A) { ... }
    public MyBuilder(B) { ... }

    public SomeClass build(C) { ... }
    public SomeClass build(D) { ... }
    public SomeClass build(E) { ... }

}

使用例:

new MyBuilder(A).build(C)

考えられる組み合わせが 6 つしかない場合は、既存のコードの複雑さと重複を許容できるでしょう。しかし、さらに可能性があり、コードが将来拡張される場合は、ここでこのパターンをお勧めします。


このパターンをより多くの引数に拡張できますが、より多くの中間クラスが必要になるため、見苦しくなります。3 つの引数の場合、次のようなものを実装できます。

class MyBuilder1 {
    public MyBuilder1(A) { ... }
    public MyBuilder1(B) { ... }

    public MyBuilder2 build(C) { ... }
    public MyBuilder2 build(D) { ... }
    public MyBuilder2 build(E) { ... }

    class MyBuilder2 {
        public MyBuilder2(C) { ... }
        public MyBuilder2(D) { ... }
        public MyBuilder2(E) { ... }

        public SomeClass build(F) { ... }
        public SomeClass build(G) { ... }
    }
}

SomeClass x = new MyBuilder1(B).build(D).build(F);

残念ながら、中間段階では、型 C、D、E のメソッドとコンストラクターを複製する必要があります。

于 2016-02-23T16:53:51.417 に答える