2013-10-02 22 views
5

在課堂外使用生成器模式的優點是什麼?內部vs外部的生成器模式?

內部類:

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

對於簡單的事情它並不重要,但是你可能希望使用setter返回類型的一些其他表明(複雜的制定者),在這種情況下,外部人員可以提供更大的靈活性。我個人會選擇外部的。 – Thihara

+0

恕我直言,生成器應該是一個內部類,因爲它是專門由正在構建的類使用。因此,將其定爲普通班級沒有真正的好處。 – hfontanez

回答

7

這要看情況。

我經常結合BuilderFactory模式是很有意義有Builder作爲一個課外自「內置」對象,可能還有很多的實現方式之一。這還有一個額外的好處,就是允許這些實現是包裝私有的,甚至是Builder的私有內部類。

如果您使用Builder來使公共類的構造函數更多的意圖顯示或更少的混亂,而不是真正的個人偏好。我們可以權衡在API中增加一個類的優缺點,這可能會讓用戶感到困惑。

但是,我建議選擇其中一個選項並在整個API中堅持使用它。如果所有的構建器都是內部類或外部類,它使得整個系統架構更易於理解;不要混合它們。

不喜歡這種混合內外建設者:

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

Bar bar = new BarBuilder(...) 
1

第二屆執行向你保證,你會得到一個最終的目標,從而使其更加可靠的實施 而首先是不成文的,直到ü完成設置所有的字段。

一般而言,您不希望未指定的對象可供使用。