Java構建器(Builder)

劉_小星發表於2017-01-13

Java構建器(Builder)

在設計模式中對Builder模式的定義是用於構建複雜物件的一種模式,所構建的物件往往需要多步初始化或賦值才能完成。那麼,在實際的開發過程中,我們哪些地方適合用到Builder模式呢?其中使用Builder模式來替代多引數建構函式是一個比較好的實踐法則。

考慮用一個類表示包裝食品外面現實的營養成分,這些標籤通常有許多的引數,如果用重疊構造器模式,就必須寫多個構造器(constructor):

  • 不帶引數的構造器
  • 一個引數的構造器
  • 二個引數的構造器

下面我們使用Java的構建器(Builder)模式

public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    //NutritionFacts內部靜態類Builder類
    //靜態類和靜態方法的使用比起來頻率很低
    public static class Builder{
        //靜態變數
        private  static int servingSize;
        private  static int servings ;

        private int calories = 0;
        //Builder自己的構造方法
        public Builder(int servingSize,int servings){
            this.servingSize = servingSize;
            this.servings = servings;
        }
        //Builder的賦值方法,返回一個Builder物件,接下來可以接著操作
        public Builder calories( int val){
            this.calories = val;
            return this;
        }
        //Builder的賦值方法2,返回一個Builder物件,接下來可以接著操作
        //Builder的賦值方法3,返回一個Builder物件,接下來可以接著操作
        //Builder的賦值方法4,返回一個Builder物件,接下來可以接著操作
        //......

        //builder 方法返回的是NutritionFacts 類
        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }
    //NutritionFacts的Constructor方法,傳入一個builder物件,對自己的引數賦值
    private NutritionFacts(Builder builder){
        servingSize =builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
    }
    //NutritionFacts自己的操作方法
    public int getCalories(){
        return this.calories;
    }
}
public class test {
    public   static void main(String[] args){
    //通過new NutritionFacts.Builder(1,2)建立了一個Builder類
    //然後呼叫賦值方法calories給Builder的calories屬性賦值,返回Builder類
    //可以繼續呼叫賦值方法,我偷懶沒寫了TAT
    //最後呼叫Builder類的builde()返回我們需要的NutritionFacts物件。
     NutritionFacts nf =  new NutritionFacts.Builder(1,2).calories(3).build();
        System.out.println(nf.getCalories());
    }
}

相關文章