2011-04-09 61 views
10

根據有效的Java 2ED 項目2重構使用Builder模式或伸縮式構造格局

伸縮構造模式,在 您提供 只有所需參數的構造函數,另一個 與一個可選參數 ,第三個帶有兩個可選參數 等等,最終在 構造函數中帶有所有可選的 參數。

應用該模式的類的構造器的一個例子是從When would you use the Builder Pattern?

代碼組1A借用

Pizza(int size) { ... }   
Pizza(int size, boolean cheese) { ... }  
Pizza(int size, boolean cheese, boolean pepperoni) { ... }  
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... } 

大小是需要參數。 奶酪,意大利辣香腸和培根可選參數。 假設我想提供如下的構造函數。

代碼設置1B

Pizza(int size) { ... }   
Pizza(int size, boolean cheese) { ... }  
Pizza(int size, boolean pepperoni) { ... }  
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon, int price, int) { ... } 

另一個例子是,

代碼中設置2

public AttributeKey(String key, Class<T> clazz) 
public AttributeKey(String key, Class<T> clazz) 
public AttributeKey(String key, Class<T> clazz, @Nullable T defaultValue, boolean isNullValueAllowed) 
public AttributeKey(String key, Class<T> clazz, @Nullable T defaultValue, boolean isNullValueAllowed, @Nullable ResourceBundleUtil labels) 

兩款最新例子我給沒有跟隨characterist作爲代碼集1a的可伸縮構造器

  1. 代碼集1b和2是否包含在伸縮構造函數中?如果不是,它叫什麼?
  2. 相較於使用生成器模式,其中之一(生成器之間和代碼組1a的圖案,2)提供了更多的好處
+1

1b和2都給出編譯時錯誤,因爲它們有兩個具有相同簽名的構造函數。 – Superole 2014-01-28 08:01:07

+0

其他答案http://stackoverflow.com/a/1953567/632951將提供更多信息... – Pacerier 2014-08-17 12:06:55

回答

1

在這種情況下,我會選擇構建器或調用者可以傳遞一系列澆頭的不同機制。如果您需要驗證允許的配合,您可以在構造函數或澆頭設置器中執行該操作。伸縮/鏈式構造函數方法可能要求您將來添加其他構造函數以處理額外的澆頭組合,而採集方法將自動處理任何場景。我也會避免在比薩類中爲不同類型的澆頭配置特定的屬性。如果你需要處理額外的奶酪呢?一個cheese布爾將不會處理。 Topping類可以是一個帶有子類的完整對象,也可以用一個字符串替換它。

public class Pizza 
{ 
    // setters don't have to be private... 
    public int Size {get; private set;} 
    private List<Topping> toppings {get; private set;} 

    public Pizza(int size) : this(size, new List<Topping>()) // call the other ctor with an empty list of toppings 
    { 
    } 

    public Pizza(int size, List<Topping> toppings) 
    { 
     Size = size; 
     Toppings = toppings; 
    } 
} 
2

什麼constructors'parameters的這種模式稱爲?

這不是一個設計模式本身,但它是一種稱爲構造函數鏈的編程技巧。

相較於使用Builder模式,其中一個提供了更多的好處

相同的,所以問題:你已經還借When would you use the Builder Pattern?了差異很好。簡而言之,構建器比構造器鏈更受歡迎,因爲它可能導致構建器的擴散,而這些構造器可能難以維護。

希望有所幫助。

+0

內容豐富的SO鏈接! – ritesht93 2017-08-22 10:40:20