生成器模式(Builder)
目的
將複雜物件的構造與其表示分開,以便相同的構造過程可以建立不同的表示。
說明
例如角色扮演遊戲的角色生成器。最簡單的選擇是讓計算機為你建立角色。但是如果你想選擇職業,性別,頭髮顏色等角色細節,那麼角色生成就會逐步完成所有選擇準備就緒的過程。
簡而言之
允許您建立不同風格的物件,同時避免對建構函式造成汙染。當物件有多種風格,或在建立物件時涉及很多步驟時適用。
維基百科說
生成器模式是物件建立軟體設計模式,其目的是找到伸縮構造器反模式的解決方案。
那麼伸縮建構函式反模式是什麼?在某一點上,我們看到了如下的建構函式:
public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) { }
正如您所看到的,建構函式引數的數量很快就會失控,並且可能難以理解引數的排列。此外,如果您希望將來新增更多選項,此引數列表可能會繼續增長。這被稱為伸縮構造器反模式。
原始碼示例
理智的替代方案是使用Builder模式。
首先,我們有了想要創造的英雄
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); } } |
它可以用作:
Hero mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build(); |
適用場景
- 建立複雜物件的演算法應獨立於組成物件的部分以及它們的組裝方式
- 構造過程必須允許對構造的物件進行不同的表示
相關文章
- 設計模式-生成器模式Builder設計模式UI
- 【設計模式】- 生成器模式(Builder)設計模式UI
- 設計模式十: 生成器模式(Builder Pattern)設計模式UI
- Builder 模式UI模式
- 建立模式 03-Builder模式模式UI
- 設計模式:Builder模式概述設計模式UI
- 建造者模式(Builder)模式UI
- JavaBean之Builder模式JavaBeanUI模式
- Java設計模式之builder模式Java設計模式UI
- 設計模式-建造者模式(Builder)設計模式UI
- 有聲讀物生成器:Audiobook Builder for MacUIMac
- 建造者模式(Builder Pattern)模式UI
- 設計模式--建造者模式(Builder Pattern)設計模式UI
- 【設計模式筆記】(二)- Builder模式設計模式筆記UI
- 構建者模式(Builder pattern)模式UI
- Builder模式與Java語法UI模式Java
- Builder模式,今天你用了嘛UI模式
- 深入瞭解 Builder 模式 - frankelUI模式
- 《設計模式》 - 3. 建立者模式( Builder )設計模式UI
- 設計模式(五)Builder構建者模式設計模式UI
- Builgen 外掛——IntelliJ IDEA和Eclipse Java Bean Builder模式程式碼生成器-比lombok更符合需求...UIIntelliJIdeaEclipseJavaBean模式Lombok
- Java Builder 模式,你搞懂了麼?JavaUI模式
- 重識設計模式-建造者模式(Builder Pattern)設計模式UI
- C#設計模式-建造者模式(Builder Pattern)C#設計模式UI
- 有聲讀物生成器推薦:Audiobook Builder-MacwUIMac
- 人人都會設計模式: 07、建造者模式--Builder設計模式UI
- PHP生成器模式PHP模式
- java靈活傳參之builder模式JavaUI模式
- Java 高效程式設計之 Builder 模式Java程式設計UI模式
- 設計模式(三):生成器模式設計模式
- 歡迎使用開源的程式碼生成器Code-BuilderUI
- 設計模式實戰系列之@Builder和建造者模式設計模式UI
- 自由擴充套件你的專案——Builder模式套件UI模式
- 一天一個設計模式(三) - 建造者模式(Builder)設計模式UI
- @Builder.Default 及@BuilderUI
- 使用Builder設計模式實現不變性 - DZone JavaUI設計模式Java
- Builder設計模式結合lombok減少過多傳參UI設計模式Lombok
- .NET-9-計算機思想-構建器模式(Builder Pattern)計算機模式UI