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

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

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

8.1 遊戲角色設計

Sunny軟體公司遊戲開發小組決定開發一款名為《Sunny群俠傳》的網路遊戲,該遊戲採用主流的RPG(Role Playing Game,角色扮演遊戲)模式,玩家可以在遊戲中扮演虛擬世界中的一個特定角色,角色根據不同的遊戲情節和統計資料(如力量、魔法、技能等)具有不同的能力,角色也會隨著不斷升級而擁有更加強大的能力。

作為RPG遊戲的一個重要組成部分,需要對遊戲角色進行設計,而且隨著該遊戲的升級將不斷增加新的角色。不同型別的遊戲角色,其性別、臉型、服裝、髮型等外部特性都有所差異,例如“天使”擁有美麗的面容和披肩的長髮,並身穿一襲白裙;而“惡魔”極其醜陋,留著光頭並穿一件刺眼的黑衣。

Sunny公司決定開發一個小工具來建立遊戲角色,可以建立不同型別的角色並可以靈活增加新的角色。

       Sunny公司的開發人員通過分析發現,遊戲角色是一個複雜物件,它包含性別、臉型等多個組成部分,不同的遊戲角色其組成部分有所差異,如圖8-1所示:

8-1 幾種不同的遊戲角色造型

(注:本圖中的遊戲角色造型來源於網路,特此說明)

無論是何種造型的遊戲角色,它的建立步驟都大同小異,都需要逐步建立其組成部分,再將各組成部分裝配成一個完整的遊戲角色。如何一步步建立一個包含多個組成部分的複雜物件,建造者模式為解決此類問題而誕生。

8.2 建造者模式概述

      建造者模式是較為複雜的建立型模式,它將客戶端與包含多個組成部分(或部件)的複雜物件的建立過程分離,客戶端無須知道複雜物件的內部組成部分與裝配方式,只需要知道所需建造者的型別即可。它關注如何一步一步建立一個的複雜物件,不同的具體建造者定義了不同的建立過程,且具體建造者相互獨立,增加新的建造者非常方便,無須修改已有程式碼,系統具有較好的擴充套件性。

      建造者模式定義如下:

建造者模式(Builder Pattern):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。建造者模式是一種物件建立型模式。

      建造者模式一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可以構建它們,使用者不需要知道內部的具體構建細節。建造者模式結構如圖8-2所示:

8-2 建造者模式結構圖

      在建造者模式結構圖中包含如下幾個角色:

 Builder(抽象建造者):它為建立一個產品Product物件的各個部件指定抽象介面,在該介面中一般宣告兩類方法,一類方法是buildPartX(),它們用於建立複雜物件的各個部件;另一類方法是getResult(),它們用於返回複雜物件。Builder既可以是抽象類,也可以是介面。

ConcreteBuilder(具體建造者):它實現了Builder介面,實現各個部件的具體構造和裝配方法,定義並明確它所建立的複雜物件,也可以提供一個方法返回建立好的複雜產品物件。

Product(產品角色):它是被構建的複雜物件,包含多個組成部件,具體建造者建立該產品的內部表示並定義它的裝配過程。

 Director(指揮者):指揮者又稱為導演類,它負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中呼叫建造者物件的部件構造與裝配方法,完成複雜物件的建造。客戶端一般只需要與指揮者進行互動,在客戶端確定具體建造者的型別,並例項化具體建造者物件(也可以通過配置檔案和反射機制),然後通過指揮者類的建構函式或者Setter方法將該物件傳入指揮者類中。

      在建造者模式的定義中提到了複雜物件,那麼什麼是複雜物件?簡單來說,複雜物件是指那些包含多個成員屬性的物件,這些成員屬性也稱為部件或零件,如汽車包括方向盤、發動機、輪胎等部件,電子郵件包括髮件人、收件人、主題、內容、附件等部件,一個典型的複雜物件類程式碼示例如下:

class Product  {

       private  String partA; //定義部件,部件可以是任意型別,包括值型別和引用型別

       private  String partB;

       private  String partC;

       //partAGetter方法和Setter方法省略

       //partBGetter方法和Setter方法省略

       //partCGetter方法和Setter方法省略

}

      在抽象建造者類中定義了產品的建立方法和返回方法,其典型程式碼如下:

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()方法,通過呼叫ProductsetPartX()方法可以給產品物件的成員屬性設值。不同的具體建造者在實現buildPartX()方法時將有所區別,如setPartX()方法的引數可能不一樣,在有些具體建造者類中某些setPartX()方法無須實現(提供一個空實現)。而這些對於客戶端來說都無須關心,客戶端只需知道具體建造者型別即可。

      在建造者模式的結構中還引入了一個指揮者類Director,該類主要有兩個作用:一方面它隔離了客戶與建立過程;另一方面它控制產品的建立過程,包括某個buildPartX()方法是否被呼叫以及多個buildPartX()方法呼叫的先後次序等。指揮者針對抽象建造者程式設計,客戶端只需要知道具體建造者的型別,即可通過指揮者類呼叫建造者的相關方法,返回一個完整的產品物件。在實際生活中也存在類似指揮者一樣的角色,如一個客戶去購買電腦,電腦銷售人員相當於指揮者,只要客戶確定電腦的型別,電腦銷售人員可以通知電腦組裝人員給客戶組裝一臺電腦。指揮者類的程式碼示例如下:

class Director {

       private  Builder builder;

       public  Director(Builder builder) {

              this.builder=builder;

       }

       public  void setBuilder(Builder builder) {

              this.builder=builer;

       }

     //產品構建與組裝方法

       public Product construct() {

              builder.buildPartA();

              builder.buildPartB();

              builder.buildPartC();

              return builder.getResult();

       }

}

      在指揮者類中可以注入一個抽象建造者型別的物件,其核心在於提供了一個建造方法construct(),在該方法中呼叫了builder物件的構造部件的方法,最後返回一個產品物件。

      對於客戶端而言,只需關心具體的建造者即可,一般情況下,客戶端類程式碼片段如下所示:

……

Builder  builder = new ConcreteBuilder(); //可通過配置檔案實現

Director director = new  Director(builder);

Product product = director.construct();

……

      可以通過配置檔案來儲存具體建造者類ConcreteBuilder的類名,使得更換新的建造者時無須修改原始碼,系統擴充套件更為方便。在客戶端程式碼中,無須關心產品物件的具體組裝過程,只需指定具體建造者的型別即可。

      建造者模式與抽象工廠模式有點相似,但是建造者模式返回一個完整的複雜產品,而抽象工廠模式返回一系列相關的產品;在抽象工廠模式中,客戶端通過選擇具體工廠來生成所需物件,而在建造者模式中,客戶端通過指定具體建造者型別並指導Director類如何去生成物件,側重於一步步構造一個複雜物件,然後將結果返回。如果將抽象工廠模式看成一個汽車配件生產廠,生成不同型別的汽車配件,那麼建造者模式就是一個汽車組裝廠,通過對配件進行組裝返回一輛完整的汽車。

相關推薦

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

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

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

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

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

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的意思是建造者或者建築工人,談到建造自然會想到樓房。樓房是千差萬別的,樓房的外形、層數、內部房間的數量、房間的裝飾等等都不一樣,但是對於建造者來說,抽象出來的建築流程是確定的,往往建築

建造模式

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

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

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

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

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

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

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

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