2012-08-13 91 views
1

需要創建一個未指定數量的對象,我試圖創建一個這樣的構建器。一切都很好,直到我意識到我的構建器創建了具有相同值的屬性的所有對象。靜態工廠生成器故障

所以,當我打電話建設者:

ValidationHelper v = new ValidationHelper.HelperBuilder() 
     .addHelper("ICAO Identifier", icaoIdentifier, rulesICAO) 
     .addHelper("Long Name", longName, rulesLongName) 
     .build(); 

...我有2個對象及其屬性將有最後一個對象生成器被要求創造的價值。

首先,工廠建設者對此是否審慎?其次,我的建築師是否可以挽救?

生成器:

public class ValidationHelper { 

    private static ArrayList<HelperBuilder> validatorHelpers = new ArrayList(); 


    public static class HelperBuilder { 

     private String txtFieldName; 
     private String txtFieldValue; 

     private List<Integer> valCodes = new ArrayList<Integer>(); 

     private ArrayList<HelperBuilder> innerValidatorHelpers = new ArrayList<HelperBuilder>(); 

     public HelperBuilder() {} 

     public final HelperBuilder addHelper(String txtFieldName, String txtFieldValue, int[] validationCodes) { 

      this.txtFieldName = txtFieldName; 
      this.txtFieldValue = txtFieldValue; 
      for(int i = 0; i < validationCodes.length; i++){ 
       getValCodes().add((Integer) validationCodes[i]); 
      } 

      innerValidatorHelpers.add(this); 
      return this; 
     } 

     public final ValidationHelper build() { 
      return new ValidationHelper(this); 
     } 

     public String getTxtFieldName() { 
      return txtFieldName; 
     } 

     public String getTxtFieldValue() { 
      return txtFieldValue; 
     } 

     public List<Integer> getValCodes() { 
      return valCodes; 
     } 
    }//end HelperBuilder 

    private ValidationHelper(HelperBuilder helperBuilder) { 
     validatorHelpers = helperBuilder.innerValidatorHelpers; 
    } 

    public void setHelpers(ArrayList validatorHelpers) { 
     validatorHelpers = validatorHelpers; 
    } 

    public ArrayList getHelpers() { 
     return validatorHelpers; 
    } 
} 

編輯/ FIXED:

因此,對於它的價值,這裏的修訂建設者。它需要另一個構造函數來正確初始化它應該構建的實例。

public class ValidationHelper { 

    private static ArrayList<HelperBuilder> validatorHelpers = new ArrayList(); 

    public static class HelperBuilder { 

     private String txtFieldName; 
     private String txtFieldValue; 

     private List<Integer> valCodes = new ArrayList<Integer>(); 

     private ArrayList<HelperBuilder> innerValidatorHelpers = new ArrayList<HelperBuilder>(); 

     public HelperBuilder() {} 
     public HelperBuilder(String txtFieldName, String txtFieldValue, int[] validationCodes) { 

      this.txtFieldName = txtFieldName; 
      this.txtFieldValue = txtFieldValue; 

      for (int i = 0; i < validationCodes.length; i++) { 
       valCodes.add((Integer) validationCodes[i]); 
      } 

     } 

     public final HelperBuilder addHelper(String txtFieldName, String txtFieldValue, int[] validationCodes) { 
      innerValidatorHelpers.add(new HelperBuilder(txtFieldName, txtFieldValue, validationCodes)); 
      return this; 
     } 

     public final ValidationHelper build() { 
      return new ValidationHelper(this); 
     } 

     public String getTxtFieldName() { 
      return txtFieldName; 
     } 

     public String getTxtFieldValue() { 
      return txtFieldValue; 
     } 

     public List getValCodes() { 
      return valCodes; 
     } 
    }//end HelperBuilder 

    private ValidationHelper(HelperBuilder helperBuilder) { 
     validatorHelpers = helperBuilder.innerValidatorHelpers; 
    } 

    public ArrayList getHelpers() { 
     return validatorHelpers; 
    } 
} 

回答

2

每次只覆蓋值

private String txtFieldName; 
private String txtFieldValue; 

,最後一個WINNS。所以,你在這裏創建僅1 HelperInstance

ValidationHelper v = new ValidationHelper.HelperBuilder() 

和字段名稱和值在每次調用addHelper時間被覆蓋()。但是你需要爲每個「配置」創建一個實例。所以addHelper應該創建一個新實例,並將其添加到

private ArrayList<HelperBuilder> innerValidatorHelpers = ...; 
+0

...這是什麼開始變得清晰,因爲我發佈的問題:-) – vector 2012-08-13 14:17:22

2

如果你想建立與你必須要麼

  • 不同值的對象更改創建對象,所以它會建立不同的東西之間的建設者。
  • 指示建造者自動改變數值,例如根據日期使用計數器或文件名,或提供值列表。