2013-10-02 1 views
5

クラス内外のビルダーパターンを使用するメリットは何ですか?ビルダーパターンは対外クラスですか?

内部クラス:

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(); 
+0

これは意見に基づいています...しかし、私はそれが混乱を下げることがあると思います。 MyClass.Builder、MyClass2.Builderなどがあり、MyClassBuilder、MyClass2Builderなどのクラスは一切ありません。 – ppeterka

+0

簡単なことについては、それほど重要ではありませんが、セッターの戻り値の型を他のもの(複雑な設定者で)表示することができ、その場合、外部のものはより柔軟性を提供するであろう。個人的に私は外部のものと一緒に行きます。 – Thihara

+0

IMHOの場合、ビルダーはビルドされるクラスによってのみ使用されるため、内部クラスにする必要があります。そのため、それを通常のクラスにすることには本当のメリットはありません。 – hfontanez

答えて

7

私は多くの場合、BuilderFactoryのパターンを組み合わせるので、 "ビルド"オブジェクトは多くの実装の1つになる可能性があるため、ビルダーを外部クラスとして持つことは理にかなっています。これにより、実装をパッケージプライベート、またはBuilderのプライベート内部クラスにすることができるという利点があります。

ビルダーを使用して、パブリッククラスのコンストラクタを実際に個人的な好みよりも明示的にまたは煩雑にならないようにする場合。 APIに追加のクラスを持つことでユーザーに混乱を招く可能性がある長所と短所を勘案することができます。

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

は次のように内側と外側のビルダーを混ぜて使用しないでください:

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

Bar bar = new BarBuilder(...) 
1

第二実装はあなたが完成したオブジェクトを取得するので、作ってあげることを保証それより信頼性の高い実装 最初は暗黙それまではuがある一方、すべてのフィールドの設定を終了します。

一般に、あなたは無言のオブジェクトを使用できるようにしたくないです。

関連する問題