Builder 模式,中文翻譯為建造者模式或者構建者模式,也有人叫它生成器模式。允許你創建不同口味的對象同時避免構造器污染。當一個對象可能有幾種口味,或者一個對象的創建涉及到很多步驟時會很有用。
現實世界例子:想象一個角色扮演游戲的角色生成器。最簡單的選擇是讓計算機為你創建角色。但是如果你想選擇一些像專業,性別,發色等角色細節時,這個角色生成就變成了一個漸進的過程。當所有選擇完成時,該過程也將完成。
通過構造器、set函數創建對象沒有建造者模式靈活,也就是建造者具有這三個特性:依賴關系(Dependencies)、合法校驗(Preconditions)、不可變(Immutable)。
建造者模式的優點包括:
- 分離構建和表示:通過建造者模式,將一個復雜對象的構建過程與其表示相分離,使得同樣的構建過程可以創建不同的表示形式。
- 更好的封裝性和擴展性:可以將構建過程中的每個步驟封裝在具體的建造者中,使得對于產品的構建過程進行更加精細的控制和管理。
- 避免構造函數參數過多:通過使用建造者模式,可以避免通過構造函數參數傳遞大量的可選參數,使得構造函數的定義更加簡潔明了。
建造者模式適用于需要創建復雜對象且對象的構建過程比較穩定的情況。如果對象的構建過程非常簡單或者對象的表示形式只有一種,可能并不適合使用建造者模式。在實際應用中,可以根據具體需求和設計的復雜程度來選擇是否使用建造者模式。
建造者模式的實現
說明
建造者模式(Builder Pattern)可以將一個復雜對象的構建過程與其表示相分離,使得同樣的構建過程可以創建不同的表示。
在軟件開發中,有時候需要創建一個復雜的對象,該對象可能由多個部分組成,且創建過程較為復雜。使用簡單的構造函數或者靜態工廠方法來創建對象可能會導致構造函數參數過多或者構造方法變得冗長復雜,不易于維護和擴展。這時,可以使用建造者模式來解決這個問題。
編程示例
有一個英雄要創建。
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;}
}
有創建者:
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);}}
使用:
var mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();
對比構造器創建:
public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {}
以上內容基于GPT創建和整理。
參考
- 設計模式Java實現
- 設計模式之美-王爭