7

クラス内とクラス外でビルダー パターンを使用する利点は何ですか?

クラス内:

public class Person {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person setName(String name) {
        this.name = name;
        return this;
    }

    public Person setEyeColor(String eyeColor) {
        this.eyeColor = eyeColor;
        return this;
    }

    public Person setHairColor(String hairColor) {
        this.hairColor = hairColor;
        return this;
    }
} 

// Example usage:
Person p = new Person()
                 .setName("Bob")
                 .setHairColor("Black")
                 .setEyeColor("Brown")

授業外:

public class Person {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person(String name, String eyeColor, String hairColor) {
        this.name = name;
        this.eyeColor = eyeColor;
        this.hairColor = hairColor; 
    }  
} 

public class PersonBuilder {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person build() {
        return new Person(name, eyeColor, hairColor);
    }

    public PersonBuilder with(String name) {
        this.name = name;
        return this;
    }

    public PersonBuilder setEyeColor(String eyeColor) {
        this.eyeColor = eyeColor;
        return this;
    }

    public PersonBuilder setHairColor(String hairColor) {
        this.hairColor = hairColor;
        return this;
    }
} 

// Example usage:
Person p = new PersonBuilder()
                 .setName("Bob")
                 .setHairColor("Black")
                 .setEyeColor("Brown")
                 .build();
4

2 に答える 2

9

場合によります。

「構築された」オブジェクトは多くの実装の 1つBuilderFactoryなる可能性があるため、Builder を外部クラスとして持つことは理にかなっています。これには、実装をパッケージ プライベートまたはビルダーのプライベート 内部クラスにできるという追加の利点があります。

Builder を使用して public クラスのコンストラクターをより意図的に明らかにしたり、実際の個人的な好みよりもすっきりさせたりする場合。ユーザーを混乱させる可能性のある追加のクラスを API に含めることの長所と短所を比較検討することができます。

ただし、オプションの 1 つを選択し、API 全体でそれを使用することをお勧めします。すべての Builder が内部クラスまたは外部クラスのいずれかであるかどうかにより、全体的なシステム アーキテクチャが理解しやすくなります。それらを混ぜないでください。

次のように、内部ビルダーと外部ビルダーを混在させないでください。

Foo foo = new Foo.Builder(...)

Bar bar = new BarBuilder(...)
于 2013-10-02T20:27:32.787 に答える