問題描述
一個複雜對象由不同的子部件構成,依據不同的上下文,該複雜對象的子部件可能有不同的具體類型(從用戶來看,該複雜對象有不同的外在表現)。如何通過一個相同的構造過程,產生這種不同的複雜對象?也可以說:如何隔離對象的構造過程和對象的具體表現形式?
Builder模式
如圖所示,Builder類定義了構造一個複雜對象內部各個子部件的抽象接口(即多個不同的BuildPart()接口),Director類定義了一個模板方法 (即Construct()方法),該模板方法依據一定的算法,調度這些子部件創建接口來逐步完善該複雜對象的創建過程,並在該模板方法的最後一步返回所創建的複雜對象。傳遞不同的ConcreteBuilder對象給Director對象,Director的模板方法能夠產生不同的複雜對象。通常BuildPart()接口並不必要返回子部件類型,因爲Director對象通常不關心子部件的具體類型和抽象類型。因此:Director對象抽象了複雜對象的創建過程;Builder對象則封裝了複雜對象子部件的構造方法並隱藏了子部件的抽象類型。通過Director對象和Builder對象協作,隔離了對象的構造過程和對象的具體表現形式。
討論
總結起來,Builder模式定義了兩個層次的對象創建方法:
- 對於Director對象來說,Builder對象提供了創建複雜對象子部件的抽象方法,這些方法隱藏了子部件的抽象類型。Director對象調度Builder對象的抽象方法,逐步構造複雜對象的各個子部件,並在最後一步返回複雜對象。
- 對於客戶來說,Director對象提供的模板方法,讓客戶能夠通過相同的方法調用,創造具有不同表現形式的複雜對象。
和其它創建型模式比較起來,Builder模式的優點在於:
- 客戶不需要了解複雜對象子部件的類型,降低了客戶和所創建對象的相關性。
- 客戶通過配置不同的ConcreteBuilder對象給Director對象,Director對象調度相同的步驟(即模板方法),創建出不同的對象。
Builder模式隔離了對象的構造過程和對象的具體表示。