1. 程式人生 > >複雜物件的組裝與建立——建造者模式(三)

複雜物件的組裝與建立——建造者模式(三)

8.4 關於Director的進一步討論

指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫BuilderbuildPartX()方法,控制呼叫的先後次序,並向客戶端返回一個完整的產品物件。下面我們討論幾種Director的高階應用方式:

       1.省略Director

      在有些情況下,為了簡化系統結構,可以將Director和抽象建造者Builder進行合併,在Builder中提供逐步構建複雜產品物件的construct()方法。由於Builder類通常為抽象類,因此可以將construct()

方法定義為靜態(static)方法。如果將遊戲角色設計中的指揮者類ActorController省略,ActorBuilder類的程式碼修改如下:

abstract class ActorBuilder

{

       protected static Actor actor = new  Actor();

       public  abstract void buildType();

       public  abstract void buildSex();

       public  abstract void buildFace();

       public  abstract void buildCostume();

       public  abstract void buildHairstyle();

       public static Actor  construct(ActorBuilder ab)

       {

              ab.buildType();

              ab.buildSex();

              ab.buildFace();

              ab.buildCostume();

              ab.buildHairstyle();

              return actor;

       }

}

      對應的客戶端程式碼也將發生修改,其程式碼片段如下所示:

              ……

              ActorBuilder  ab;

              ab  = (ActorBuilder)XMLUtil.getBean();

              Actor  actor;

              actor =  ActorBuilder.construct(ab);

                ……

除此之外,還有一種更簡單的處理方法,可以將construct()方法的引數去掉,直接在construct()方法中呼叫buildPartX()方法,程式碼如下所示:

abstract class ActorBuilder

{

       protected  Actor actor = new Actor();

       public  abstract void buildType();

       public  abstract void buildSex();

       public  abstract void buildFace();

       public  abstract void buildCostume();

       public  abstract void buildHairstyle();

       public Actor construct()

       {

              this.buildType();

              this.buildSex();

              this.buildFace();

              this.buildCostume();

              this.buildHairstyle();

              return actor;

       }

}

      客戶端程式碼程式碼片段如下所示:

……

              ActorBuilder  ab;

              ab  = (ActorBuilder)XMLUtil.getBean();

              Actor  actor;

              actor = ab.construct();

……

      此時,construct()方法定義了其他buildPartX()方法呼叫的次序,為其他方法的執行提供了一個流程模板,這與我們在後面要學習的模板方法模式非常類似。

      以上兩種對Director類的省略方式都不影響系統的靈活性和可擴充套件性,同時還簡化了系統結構,但加重了抽象建造者類的職責,如果construct()方法較為複雜,待構建產品的組成部分較多,建議還是將construct()方法單獨封裝在Director中,這樣做更符合“單一職責原則”。

       2.鉤子方法的引入

建造者模式除了逐步構建一個複雜產品物件外,還可以通過Director類來更加精細地控制產品的建立過程,例如增加一類稱之為鉤子方法(HookMethod)的特殊方法來控制是否對某個buildPartX()的呼叫。

鉤子方法的返回型別通常為boolean型別,方法名一般為isXXX(),鉤子方法定義在抽象建造者類中。例如我們可以在遊戲角色的抽象建造者類ActorBuilder中定義一個方法isBareheaded(),用於判斷某個角色是否為“光頭(Bareheaded)”,在ActorBuilder為之提供一個預設實現,其返回值為false,程式碼如下所示:

abstract class ActorBuilder

{

       protected  Actor actor = new Actor();

       public  abstract void buildType();

       public  abstract void buildSex();

       public  abstract void buildFace();

       public  abstract void buildCostume();

       public  abstract void buildHairstyle();

       //鉤子方法

public boolean isBareheaded()

       {

              return false;

       }

       public  Actor createActor()

       {

              return  actor;

       }

}

      如果某個角色無須構建頭髮部件,例如“惡魔(Devil)”,則對應的具體建造器DevilBuilder將覆蓋isBareheaded()方法,並將返回值改為true,程式碼如下所示:

class DevilBuilder extends ActorBuilder

{

       public  void buildType()

       {

              actor.setType("惡魔");

       }

       public  void buildSex()

       {

              actor.setSex("");

       }

       public  void buildFace()

       {

              actor.setFace("醜陋");

       }

       public  void buildCostume()

       {

              actor.setCostume("黑衣");

       }

       public  void buildHairstyle()

       {

              actor.setHairstyle("光頭");

       }

     //覆蓋鉤子方法

       public boolean isBareheaded()

       {

              return true;

       }     

}

      此時,指揮者類ActorController的程式碼修改如下:

class ActorController

{

       public  Actor construct(ActorBuilder ab)

       {

              Actor  actor;

              ab.buildType();

              ab.buildSex();

              ab.buildFace();

              ab.buildCostume();

         //通過鉤子方法來控制產品的構建

              if(!ab.isBareheaded())

              {

                     ab. buildHairstyle();

              }

              actor=ab.createActor();

              return  actor;

       }

}

當在客戶端程式碼中指定具體建造者型別並通過指揮者來實現產品的逐步構建時,將呼叫鉤子方法isBareheaded()來判斷遊戲角色是否有頭髮,如果isBareheaded()方法返回true,即沒有頭髮,則跳過構建髮型的方法buildHairstyle();否則將執行buildHairstyle()方法。通過引入鉤子方法,我們可以在Director中對複雜產品的構建進行精細的控制,不僅指定buildPartX()方法的執行順序,還可以控制是否需要執行某個buildPartX()方法。

8.5 建造者模式總結

      建造者模式的核心在於如何一步步構建一個包含多個組成部件的完整物件,使用相同的構建過程構建不同的產品,在軟體開發中,如果我們需要建立複雜物件並希望系統具備很好的靈活性和可擴充套件性可以考慮使用建造者模式。

1.主要優點

      建造者模式的主要優點如下:

(1) 在建造者模式中,客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件。

(2) 每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件。由於指揮者類針對抽象建造者程式設計,增加新的具體建造者無須修改原有類庫的程式碼,系統擴充套件方便,符合“開閉原則”

(3) 可以更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。

2.主要缺點

      建造者模式的主要缺點如下:

(1) 建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,例如很多組成部分都不相同,不適合使用建造者模式,因此其使用範圍受到一定的限制。

(2) 如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大,增加系統的理解難度和執行成本。

3.適用場景

      在以下情況下可以考慮使用建造者模式:

(1) 需要生成的產品物件有複雜的內部結構,這些產品物件通常包含多個成員屬性。

(2) 需要生成的產品物件的屬性相互依賴,需要指定其生成順序。

(3) 物件的建立過程獨立於建立該物件的類。在建造者模式中通過引入了指揮者類,將建立過程封裝在指揮者類中,而不在建造者類和客戶類中。

(4) 隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

練習

Sunny軟體公司欲開發一個視訊播放軟體,為了給使用者使用提供方便,該播放軟體提供多種介面顯示模式,如完整模式、精簡模式、記憶模式、網路模式等。在不同的顯示模式下主介面的組成元素有所差異,如在完整模式下將顯示選單、播放列表、主視窗、控制條等,在精簡模式下只顯示主視窗和控制條,而在記憶模式下將顯示主視窗、控制條、收藏列表等。嘗試使用建造者模式設計該軟體。

相關推薦

複雜物件組裝建立——建造模式

8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build

建造模式-Builder Pattern 複雜物件組裝建立——建造模式:關於Director的進一步討論,建造模式總結

8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build

複雜物件組裝建立——建造模式

      沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的建立型模式。建造

複雜物件組裝建立——建造模式

8.3 完整解決方案       Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示: 圖8-3 遊戲角色建立結構圖       在圖8-3中,ActorCont

建造模式-Builder Pattern 複雜物件組裝建立——建造模式:遊戲角色設計的建造模式解決方案

8.3 完整解決方案       Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示: 圖8-3 遊戲角色建立結構圖       在圖8-3中,Ac

複雜物件組裝建立——建造模式:遊戲角色設計,模式概述

沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的建立型模式。建造者

複雜物件建立--建造模式Builder

1初識建造者模式 建造者模式實際上是常用的設計模式。顧名思義,builder的意思是建造者或者建築工人,談到建造自然會想到樓房。樓房是千差萬別的,樓房的外形、層數、內部房間的數量、房間的裝飾等等都不一樣,但是對於建造者來說,抽象出來的建築流程是確定的,往往建築

物件間的聯動——觀察模式

23.3 完整解決方案       為了實現物件之間的聯動,Sunny軟體公司開發人員決定使用觀察者模式來進行多人聯機對戰遊戲的設計,其基本結構如圖22-4所示: 圖22-4  多人聯機對戰遊戲結構圖       在圖22-4中,AllyControlCenter充當目

協調多個物件之間的互動——中介模式

20.3 完整解決方案      為了協調介面元件物件之間的複雜互動關係,Sunny公司開發人員使用中介者模式來設計客戶資訊管理視窗,其結構示意圖如圖20-7所示:圖20-7 引入了中介者類的“客戶資訊

【Unity3D23種設計模式建造模式Builder

產出 private 一個 gof 行為 並且 bstr reac 定義 GoF中定義: “將一個復雜的構建流程與它的對象表現分離出來,讓相同的構建流程可以產生不同的對象行為表現。” 建造者模式可以分為兩個步驟來實施: 1.將復雜的構建流程獨立出來,並將整個流程分成

設計模式建造模式Builder

人的 做出 字體 存在 分享 定義 固定 也不會 抽象方法 一個人活到70歲以上,都會經歷這樣的幾個階段:嬰兒,少年,青年,中年,老年。並且每個人在各個階段肯定是不一樣的呀,我覺得可以說世界上不存在兩個人在人生的這5個階段的生活完全一樣,但是活到70歲以上的人,都經歷了這幾

GOF23設計模式建造模式builder

gin 實例 情況 gof ace state 實現 oid sql 一、建造者模式概述   建造者模式的本質:     1.分離了對象子組件的單獨構造(由Builder負責)和裝配(由Director負責)。從而可以構造出復雜的對象。這個模式適用於:某個對象的過程復雜的情

設計模式總結篇系列:建造模式Builder

關於建造者模式網上有很多文章,也有些不同的理解。在此結合網上其他文章對建造者模式進行總結。 總體說來,建造者模式適合於一個具有較多的零件(屬性)的產品(物件)的建立過程。根據產品建立過程中零件的構造是否具有一致的先後順序,可以將其分為如下兩種形式。 一、通過Client、Director、Builder和

建造模式

建造者模式 一、建造者模式的定義 將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示,建造者模式是一步步建立一個複雜的物件,它允許使用者只通過指定複雜物件型別和內容就可以構建他們,使用者不需要知道內部的具體構造細節。 二、模式的理解

設計模式 ---建造模式Builder

建造者模式:將一個複雜物件的構建過程和表示過程分離。使得同樣的構建過程可以建立不同的表示。 它主要是用於一些複雜的物件,這些物件的內部構建間的構造順序通常是穩定的,但物件內部的構建同時面臨著複雜的變化。建造者模式提供了一個通用的介面,介面中定義了產品建立的過程

設計模式建造模式Builder

 建造者模式:是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。  建造者模式通常包括下幾個角色: 1. builder(抽象建造者):給出一個抽象結論,以規範產品物

建造模式Builder C++實現

#include <iostream> #include <string> using namespace std; class Product { private : int id; // 假設為複雜物件 string name; // 假設為複雜物件 publi

建造模式Builder

一、基本定義: 1、意圖: 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 2、適用場景: * 多個組成部分,都可以裝配到同一個物件,但是產生的結果不相同 * 相同

對Java建造模式Builder的一點理解

一,Builder模式介紹    Builder模式是一步一步建立一個複雜物件的建立型模式,它允許使用者在不知道內部建造細節的情況下,可以更精細的控制物件的構造流程。該模式是為了將構建複雜物件的過程和它的部件解耦,是的構建過程和不見得表示隔離開來。    因為一個複雜的物件有

協調多個物件之間的互動——中介模式

      騰訊公司推出的QQ作為一款免費的即時聊天軟體深受廣大使用者的喜愛,它已經成為很多人學習、工作和生活的一部分(不要告訴我你沒有QQ哦,)。在QQ聊天中,一般有兩種聊天方式:第一種是使用者與使用