設計模式系列之建造者模式(Builder Pattern)——複雜對象的組裝與創建
說明:設計模式系列文章是讀劉偉
所著《設計模式的藝術之道(軟件開發人員內功修鍊之道)》
一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的博客https://blog.csdn.net/LoveLion/article/details/17517213
模式概述
模式定義
沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給用戶,這是建造者模式
需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的創建型模式。建造者模式為客戶端返回的不是一個簡單的產品,而是一個由多個部件組成的複雜產品。
它將客戶端與包含多個組成部分(或部件)的複雜對象的創建過程分離,客戶端無須知道複雜對象的內部組成部分與裝配方式,只需要知道所需建造者的類型即可。它關注如何一步一步創建一個的複雜對象,不同的具體建造者定義了不同的創建過程,且具體建造者相互獨立,增加新的建造者非常方便,無須修改已有代碼,系統具有較好的擴展性。
建造者模式(Builder Pattern)
:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一種對象創建型模式。
建造者模式一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。
模式結構圖
建造者模式結構圖如下所示:
建造者模式結構圖中包含如下幾個角色:
-
Builder(抽象建造者)
:它為創建一個產品Product對象的各個部件指定抽象接口,在該接口中一般聲明兩類方法,一類方法是buildPartX(),它們用於創建複雜對象的各個部件;另一類方法是getResult(),它們用於返回複雜對象。Builder既可以是抽象類,也可以是接口。 -
ConcreteBuilder(具體建造者)
:它實現了Builder接口,實現各個部件的具體構造和裝配方法,定義並明確它所創建的複雜對象,也可以提供一個方法返回創建好的複雜產品對象。 -
Product(產品角色)
:它是被構建的複雜對象,包含多個組成部件,具體建造者創建該產品的內部表示並定義它的裝配過程。 -
Director(指揮者)
:指揮者又稱為導演類,它負責安排複雜對象的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中調用建造者對象的部件構造與裝配方法,完成複雜對象的建造。客戶端一般只需要與指揮者進行交互,在客戶端確定具體建造者的類型,並實例化具體建造者對象(也可以通過配置文件和反射機制),然後通過指揮者類的構造函數或者Setter方法將該對象傳入指揮者類中。
在建造者模式的定義中提到了複雜對象,那麼什麼是複雜對象
?簡單來說,複雜對象是指那些包含多個非簡單類型的成員屬性,這些成員屬性也稱為部件或零件,如汽車包括方向盤、發動機、輪胎等部件,电子郵件包括髮件人、收件人、主題、內容、附件等部件。
模式偽代碼
定義產品角色
,典型代碼如下:
public class Product {
// 定義部件,部件可以是任意類型,包括值類型和引用類型
private String partA;
private String partB;
private String partC;
// getter、setter方法省略
}
在抽象建造者
中定義了產品的創建方法和返回方法,其典型代碼如下
public abstract class Builder {
// 創建產品對象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
// 返回產品對象
public Product getResult() {
return product;
}
}
在抽象類Builder
中聲明了一系列抽象的buildPartX()
方法用於創建複雜產品的各個部件,具體建造過程在ConcreteBuilder
中實現,此外還提供了工廠方法getResult()
,用於返回一個建造好的完整產品。
在ConcreteBuilder
中實現了buildPartX()
方法,通過調用Product
的setPartX()
方法可以給產品對象的成員屬性設值。不同的具體建造者在實現buildPartX()
方法時將有所區別。
在建造者模式的結構中還引入了一個指揮者類Director
,該類主要有兩個作用:一方面它隔離了客戶與創建過程;另一方面它控制產品的創建過程,包括某個buildPartX()
方法是否被調用以及多個buildPartX()
方法調用的先後次序等。指揮者針對抽象建造者
編程,客戶端只需要知道具體建造者的類型,即可通過指揮者類調用建造者的相關方法,返回一個完整的產品對象。在實際生活中也存在類似指揮者一樣的角色,如一個客戶去購買電腦,電腦銷售人員相當於指揮者,只要客戶確定電腦的類型,電腦銷售人員可以通知電腦組裝人員給客戶組裝一台電腦。指揮者類的代碼示例如下:
public class Director {
private Builder