1. 程式人生 > >面向物件設計模式之---建造者模式(Builder Pattern)

面向物件設計模式之---建造者模式(Builder Pattern)

進入正題咯,今天要介紹的是建造者模式。可以想象一下這樣一個場景:工廠要組裝人偶的過程,以前是全手工的,難免會出現缺胳膊少腿的情況,現在都是機器流水線,這個問題就避免了。再比如我們經常見到的KFC和金拱門,它們的味道在全世界都是一樣的,但是如果我們去一些小餐館吃飯,每一次去的味道多多少少會有些不同。原因在哪裡呢?原因就在與洋快餐把所有的工序都進行了嚴格的控制,這樣生產出來的產品都是一個模子刻出來的;但是小餐館就不同了,菜好不好吃,完全憑廚師~

所以,在程式設計中為了效率(比如遊戲中要時不時產生敵人),可以將事務的細節部分和公共部分進行分離,這樣總可以保證在大體的結構上是不會出錯的,也就是不會出現缺胳膊少腿的情況。那麼細節部分怎麼辦呢?下面就要引入建造者模式

了。

建造者模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。——《大話設計模式》

建造者模式的UML類圖如下,以構造小人為例:

可以發現,建造者模式由三個部分組織,第一個部分是抽象類 Builder,它裡面規定了人由哪些部分組成,這些都是抽象方法,我們知道,如果子類不實現這些抽象方法的話,程式是編譯不成功的,這也從一個側面保證了構建人物的完整性。第二個部分是ThinBuilder和FatBuilder,它們繼承Builder類,很顯然,這兩個類是用來處理構建人物的具體細節的,這也回答了我們上邊遺留的那個問題。最後一個部分是Director類,指揮者類,由它來控制

人的組裝,從另一個方面保證完整性。這個類同時也是對外的,開發人員只需直接與Director類打交道即可,只要告訴它我們要什麼樣子的人,比如胖人,瘦人等,這個Director類會使用多型來創造我們需要的東西,無需知道構建的細節。

將構建人物的例子轉化為程式碼如下:

import java.util.*;

abstract class Builder
{
  public abstract void buildHead();
  public abstract void buildBody();
  public abstract void buildLeftArm();
  public
abstract void buildRightArm(); public abstract void buildLeftLeg(); public abstract void buildRightLeg(); } class ThinBuilder extends Builder { public void buildHead() { System.out.println("構建頭部..."); } public void buildBody() { System.out.println("構建身體,這個人比較瘦..."); } public void buildLeftArm() { System.out.println("構建左臂..."); } public void buildRightArm() { System.out.println("構建右臂..."); } public void buildLeftLeg() { System.out.println("構建左腿..."); } public void buildRightLeg() { System.out.println("構建右腿..."); } } class FatBuilder extends Builder { public void buildHead() { System.out.println("構建頭部..."); } public void buildBody() { System.out.println("構建身體,這個人比較胖..."); } public void buildLeftArm() { System.out.println("構建左臂..."); } public void buildRightArm() { System.out.println("構建右臂..."); } public void buildLeftLeg() { System.out.println("構建左腿..."); } public void buildRightLeg() { System.out.println("構建右腿..."); } } class Director { public void createPerson(Builder bt) { bt.buildHead(); bt.buildBody(); bt.buildLeftArm(); bt.buildRightArm(); bt.buildLeftLeg(); bt.buildRightLeg(); } } public class Main { public static void main(String args[]) { ThinBuilder tb = new ThinBuilder(); FatBuilder fb = new FatBuilder(); Director d = new Director(); d.createPerson(tb); d.createPerson(fb); } }

程式執行效果如下:

構建頭部...
構建身體,這個人比較瘦...
構建左臂...
構建右臂...
構建左腿...
構建右腿...
構建頭部...
構建身體,這個人比較胖...
構建左臂...
構建右臂...
構建左腿...
構建右腿...