目錄
1、什么是建造者Builder模式?
2、建造者Builder模式的利與弊
3、建造者Builder模式的應用場景
4、建造者模式中的指導者(Director)有什么作用?
5、建造者Builder模式與其他模式的關系
小結
1、什么是建造者Builder模式?
Builder模式是一種創建型設計模式,用于將復雜對象的構建過程和表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式又稱為生成器模式,主要用于對復雜對象的構建及初始化,它可以將多個簡單的組件對象按順序一步步組裝起來,最終完成一個復雜的成品對象。與工廠系列模式不同的是,建造者模式的主要目的在于把煩瑣的構建過程從不同對象中抽離出來,使其脫離并獨立于產品類與工廠類,最終實現用同一套標準的制造工序能夠產出不同的產品。
在生活中,一個常見的例子是建筑領域的房屋建造。我們可以將房屋的建造過程看作是使用Builder模式來創建房屋對象的過程。
假設我們需要建造一座房子,房子由多個組成部分(例如地基、樓層、墻壁、窗戶等)組成,并且每個部分都有多個屬性(例如地基的深度、樓層的高度、墻壁的材料等)。
使用Builder模式,我們可以定義一個HouseBuilder類作為建造者,它負責創建和組裝房子的各個部分。HouseBuilder類可以有一些方法來設置房子的各個屬性,例如setFoundationDepth(int depth)、setFloorHeight(int height)等。
另外,我們還可以定義一個House類作為最終構建的產品。House類包含了房子的所有屬性,并提供了訪問這些屬性的方法。
下面是一個簡化的示例代碼:
// 房子類
public class House {private int foundationDepth;private int floorHeight;private String wallMaterial;// 構造函數和訪問方法省略// ...
}// 建造者類
public class HouseBuilder {private House house;public HouseBuilder() {house = new House();}public void setFoundationDepth(int depth) {house.setFoundationDepth(depth);}public void setFloorHeight(int height) {house.setFloorHeight(height);}public void setWallMaterial(String material) {house.setWallMaterial(material);}public House build() {return house;}
}// 使用Builder模式創建房子對象
public class Main {public static void main(String[] args) {HouseBuilder builder = new HouseBuilder();builder.setFoundationDepth(10);builder.setFloorHeight(3);builder.setWallMaterial("Brick");House house = builder.build();// 使用房子對象進行后續操作// ...}
}
在上述示例中,HouseBuilder類負責創建和設置房子的各個屬性,最后通過build()方法返回構建好的House對象。這樣,我們可以根據需要靈活地設置房子的各個部分,并且可以通過調用build()方法來獲取最終的房子對象。
建造者模式的結構圖示:
圖片來源:設計模式-生成器(Builder) - 知乎
?圖片來源:設計模式-生成器(Builder) - 知乎
2、建造者Builder模式的利與弊
Builder模式具有以下優點:
-
隔離復雜對象的構建過程:Builder模式將復雜對象的構建過程與其表示分離,使得可以獨立地構建不同表示的對象。這樣可以簡化構建過程,提高可讀性和維護性。
-
提供靈活的構建方式:通過定義不同的Builder或者使用方法鏈式調用,可以按需設置對象的各個屬性,從而靈活地構建對象。可以根據需要組合不同的屬性,生成不同的對象實例。
-
支持構建過程的逐步完善:Builder模式可以支持逐步完善構建過程,即在Builder中逐步添加設置方法,最后調用build方法返回最終的對象。這種方式可以方便地擴展構建過程,適應不同的需求。
-
避免構造函數參數過多:當一個類的構造函數參數過多時,使用Builder模式可以避免構造函數的參數列表過長,提高代碼的可讀性。
Builder模式的一些缺點:
-
增加了類的復雜度:引入了Builder類和多個setter方法,增加了類的復雜度和代碼量。
-
對象構建過程的冗余:Builder模式會創建一個Builder對象來構建目標對象,可能會導致額外的對象創建開銷。
-
不適用于簡單對象:如果目標對象的屬性較少,構建過程相對簡單,使用Builder模式可能不是最優選擇,會增加代碼量和復雜度。
需要根據具體情況來權衡使用Builder模式的利弊。在復雜對象的構建過程中,特別是當對象具有大量屬性或者構建過程需要逐步完善時,Builder模式可以提供一種靈活、可讀性高的解決方案。
3、建造者Builder模式的應用場景
-
構建復雜對象:當需要構建的對象具有多個屬性,并且構建過程較為復雜時,可以考慮使用Builder模式。例如,構建包含大量配置選項的文檔生成器、圖形界面中的復雜組件等。
-
避免重疊構造函數:當一個類需要多個構造函數來支持不同的對象初始化方式時,可以使用Builder模式來避免創建過多的重疊構造函數,并提供更清晰的對象構建方法。
-
創建不可變對象:當需要創建不可變(Immutable)對象時,Builder模式可以很好地與不可變對象的設計原則結合,通過Builder來設置對象的屬性,最終構建出不可變的對象實例。
-
流式接口(Fluent Interface):Builder模式可以用于創建流式接口,使得客戶端代碼可以使用鏈式調用的方式來設置對象的屬性,從而提高代碼的可讀性和簡潔性。
-
多個構建過程:當需要支持多種構建過程,或者需要逐步完善構建過程時,Builder模式可以提供一種靈活的解決方案,支持根據不同需求構建不同表示的對象。
總的來說,Builder模式適用于需要構建復雜對象、有多個可選參數或需要逐步完善構建過程的情況。通過使用Builder模式,可以將對象的構建過程分離出來,提高靈活性和可讀性。
4、建造者模式中的指導者(Director)有什么作用?
在建造者模式中,指導者(Director)起到了協調和組織的作用。它負責控制構建過程,按照特定的順序調用建造者的方法來構建對象。
指導者的主要作用有以下幾點:
-
定義構建順序:指導者確定了構建過程中各個步驟的順序和調用方式。它知道哪些方法應該在何時被調用,以保證對象的正確構建。
-
解耦客戶端與具體構建過程:指導者將構建對象的過程封裝起來,并與具體的建造者解耦。客戶端不需要直接與建造者進行交互,而是通過指導者來完成對象的構建。
-
簡化客戶端代碼:指導者隱藏了構建細節,使得客戶端可以更簡潔地調用構建過程。客戶端只需要與指導者進行交互,并傳遞必要的參數,而無需關心具體的構建過程。
指導者的實現原理通常是通過將建造者作為參數進行注入,并在內部調用建造者的方法來完成構建過程。指導者根據具體需求和建造者的能力來決定調用哪些方法以及調用順序。
具體實現上,指導者可以提供一個統一的構建方法,接收建造者作為參數,并按照預定的順序調用建造者的方法來構建對象。也可以根據需要提供一系列的構建方法,每個方法負責調用建造者的特定方法,以完成特定的構建步驟。
通過指導者的存在,客戶端可以更簡單地調用構建方法,而無需關心具體的構建細節和順序,從而實現了構建過程的解耦和簡化。
5、建造者Builder模式與其他模式的關系
該片段引自:Builder
1. 許多設計從使用Factory方法(不那么復雜,通過子類更可定制)開始,并向抽象工廠、原型或生成器(更靈活,但更復雜)發展。
2. Builder專注于逐步構建復雜的對象。抽象工廠專門創建相關對象的族。Abstract Factory會立即返回產品,而Builder允許在獲取產品之前運行一些額外的構造步驟。
3. 在創建復雜的復合樹時可以使用Builder,因為可以對其構建步驟進行編程以遞歸工作。
4. 您可以將Builder和Bridge結合起來:director類扮演抽象的角色,而不同的構建器充當實現。
5. 抽象工廠、構建者和原型都可以實現為Singleton。
小結
Builder 模式的關鍵是其中的 Director 對象并不直接返回對象,而是通過分步進行對象的創建。在這里 Director 可以提供一個默認的返回對象的接口(即返回通用的復雜對象的創建,不指定或者特定唯一指定BuildPart中的參數)。
通過使用Builder模式,可以避免在構造函數或者setter方法中傳入大量參數,并且可以更加清晰地組織和管理復雜對象的構建過程。
參考:
精講設計模式-Builder模式-CSDN博客
設計模式-生成器(Builder) - 知乎
大白話建造者模式(Builder Pattern) - 張有路 - 博客園
Builder
設計模式系列3 - builder模式 - 知乎
感謝閱讀,碼字不易,多謝點贊!如有不當之處,歡迎反饋指出,感謝!