Builder方式建立物件
在建立物件需要初始化資料,資料引數不容易區別,可傳可不傳的時候,可以考慮使用Builder建造方法建立。每每當看到別人寫的用Bulder方式來呼叫,就覺得so cool,那就自己也來用Builder方式建立物件吧。
現在要錄入一系列人員的基本資訊的示例:
建立Person類
public class Person { private String name; private int age; private float height; private float weight; public Person(String name, int age, float height, float weight) { this.name = name; this.age = age; this.height = height; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } public float getWeight() { return weight; } public void setWeight(float weight) { this.weight = weight; } }
那麼建立物件就是這樣,後面引數不容易看出表示的是什麼,可讀性不強
new Person("馮提莫",18,150,43); new Person("溫婉",17,164,48);
用Builder模式進行改造
建立一個Builder類,屬性和Person類一樣,加上SetXxx()方法
static class Builder{ private String name; private int age; private float height; private float weight; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setHeight(float height) { this.height = height; } public void setWeight(float weight) { this.weight = weight; } }
將Person的構造方法改為傳入Builder物件,將Builder物件的屬性值都賦予Person物件
public Person(Builder builder){ this.name = builder.name; this.age = builder.age; this.height = builder.height; this.weight = builder.weight; }
改造Builder類,關鍵步驟是將各個set方法返回Builder類物件,這樣就能繼續愉快地連續呼叫set方法了,最後呼叫build()建立方法返回Person物件。
static class Builder{ private String name; private int age; private float height; private float weight; public Builder setName(String name) { this.name = name; return this; } public Builder setAge(int age) { this.age = age; return this; } public Builder setHeight(float height) { this.height = height; return this; } public Builder setWeight(float weight) { this.weight = weight; return this; } public Person build(){ return new Person(this); } }
將各個set方法的返回值型別改為Builder,每次都返回builder物件,這樣才能將set方法實現連續的鏈式呼叫。
build()方法建立一個person物件,會呼叫Person的帶參構造方法,將builder物件的屬性依次賦予person物件。person中的屬性值就是鏈式呼叫set方法的各個值。
使用Builder模式建立Person物件,明顯看出程式碼可讀性大大增強。注:Builder建立方式通常是在建立的物件少的情況下使用。
Person person = new Person.Builder() .setName("莉哥") .setAge(20) .setHeight(162) .setWeight(45) .build();