Java 設計模式(二)《建造者模式》

lvgo發表於2018-08-23

建造者模式

  • 型別: 建立型
  • 難度:中級

更多設計模式小故事案例程式碼詳解 >>點我!點我!點我!<< 設計模式,如此簡單~


解決問題

將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。


如何實現

將變與不變分離開


釋義

實際例子

角色扮演類的遊戲,在我們建立角色的時候,可以選擇性別,身高,職業,如果我們要實現更為複雜的角色時,膚色,頭髮顏色等。但無論你怎麼選擇當你點選確認的時候你的角色就誕生了。

簡單來講

建造者模式可以讓你使用同一個建造器,構建滿足你要求的東西,無論組裝的順序,以及組裝的內容多少。

百度百科的解釋

建造者模式是設計模式的一種,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

維基百科的解釋

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();
複製程式碼

更多完整程式碼 ===>> 傳送門


使用契機

什麼時候使用建造者模式?

  • 需要生成的物件具有複雜的內部結構。
  • 構造過程允許對構造的物件有不同的展示結果。

優缺點

優點

  1. 建造者獨立,易擴充套件。
  2. 於控制細節風險。

缺點

  1. 產品必須有共同點,範圍有限制。
  2. 如內部變化複雜,會有很多的建造類。

就在你身邊的實際應用

JDK1.9 中英文 chm 格式文件下載


參考文獻

相關文章