建造者模式
- 型別: 建立型
- 難度:中級
更多設計模式小故事案例程式碼詳解 >>點我!點我!點我!<< 設計模式,如此簡單~
解決問題
將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
如何實現
將變與不變分離開
釋義
實際例子
角色扮演類的遊戲,在我們建立角色的時候,可以選擇性別,身高,職業,如果我們要實現更為複雜的角色時,膚色,頭髮顏色等。但無論你怎麼選擇當你點選確認的時候你的角色就誕生了。
簡單來講
建造者模式可以讓你使用同一個建造器,構建滿足你要求的東西,無論組裝的順序,以及組裝的內容多少。
建造者模式是設計模式的一種,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
維基百科的解釋
Builder模式是一個物件建立設計模式,為了尋找伸縮建構函式來解決具體問題。
讓我們看一看到底是什麼是伸縮建構函式
public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {
}
複製程式碼
就像你所看到的這樣,這個建構函式的引數可能在不久的將來業務的增長,會越來越長,變得難以維護。
程式碼例項講解
此時使用建造者模式就是一個不錯的選擇
public final class Hero {
private final Profession profession;
private final String name;
private final HairType hairType;
private final HairColor hairColor;
private final Armor armor;
private final Weapon weapon;
private Hero(Builder builder) {
this.profession = builder.profession;
this.name = builder.name;
this.hairColor = builder.hairColor;
this.hairType = builder.hairType;
this.weapon = builder.weapon;
this.armor = builder.armor;
}
}
複製程式碼
然後我們需要有一個建造者 Builder
public static class Builder {
private final Profession profession;
private final String name;
private HairType hairType;
private HairColor hairColor;
private Armor armor;
private Weapon weapon;
public Builder(Profession profession, String name) {
if (profession == null || name == null) {
throw new IllegalArgumentException("profession and name can not be null");
}
this.profession = profession;
this.name = name;
}
public Builder withHairType(HairType hairType) {
this.hairType = hairType;
return this;
}
public Builder withHairColor(HairColor hairColor) {
this.hairColor = hairColor;
return this;
}
public Builder withArmor(Armor armor) {
this.armor = armor;
return this;
}
public Builder withWeapon(Weapon weapon) {
this.weapon = weapon;
return this;
}
public Hero build() {
return new Hero(this);
}
}
複製程式碼
然後他可以用作構建我們的引數。
Hero mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();
複製程式碼
使用契機
什麼時候使用建造者模式?
- 需要生成的物件具有複雜的內部結構。
- 構造過程允許對構造的物件有不同的展示結果。
優缺點
優點
- 建造者獨立,易擴充套件。
- 於控制細節風險。
缺點
- 產品必須有共同點,範圍有限制。
- 如內部變化複雜,會有很多的建造類。
就在你身邊的實際應用
- java.lang.StringBuilder
- java.nio.ByteBuffer as well as similar buffers such as FloatBuffer, IntBuffer and so on.
- java.lang.StringBuffer
- All implementations of java.lang.Appendable
- Apache Camel builders