<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 復雜對象的組裝與創建——建造者模式(一) 沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車并返回給用戶,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為復雜、使用頻率也相對較低的創建型模式。建造者模式為客戶端返回的不是一個簡單的產品,而是一個由多個部件組成的復雜產品。 8.1 游戲角色設計 Sunny軟件公司游戲開發小組決定開發一款名為《Sunny群俠傳》的網絡游戲,該游戲采用主流的RPG(Role Playing Game,角色扮演游戲)模式,玩家可以在游戲中扮演虛擬世界中的一個特定角色,角色根據不同的游戲情節和統計數據(如力量、魔法、技能等)具有不同的能力,角色也會隨著不斷升級而擁有更加強大的能力。 作為RPG游戲的一個重要組成部分,需要對游戲角色進行設計,而且隨著該游戲的升級將不斷增加新的角色。不同類型的游戲角色,其性別、臉型、服裝、發型等外部特性都有所差異,例如“天使”擁有美麗的面容和披肩的長發,并身穿一襲白裙;而“惡魔”極其丑陋,留著光頭并穿一件刺眼的黑衣。 Sunny公司決定開發一個小工具來創建游戲角色,可以創建不同類型的角色并可以靈活增加新的角色。 Sunny公司的開發人員通過分析發現,游戲角色是一個復雜對象,它包含性別、臉型等多個組成部分,不同的游戲角色其組成部分有所差異,如圖8-1所示: ![](http://my.csdn.net/uploads/201204/04/1333532286_6936.gif) 圖8-1 幾種不同的游戲角色造型 (注:本圖中的游戲角色造型來源于網絡,特此說明) 無論是何種造型的游戲角色,它的創建步驟都大同小異,都需要逐步創建其組成部分,再將各組成部分裝配成一個完整的游戲角色。如何一步步創建一個包含多個組成部分的復雜對象,建造者模式為解決此類問題而誕生。 8.2 建造者模式概述 建造者模式是較為復雜的創建型模式,它將客戶端與包含多個組成部分(或部件)的復雜對象的創建過程分離,客戶端無須知道復雜對象的內部組成部分與裝配方式,只需要知道所需建造者的類型即可。它關注如何一步一步創建一個的復雜對象,不同的具體建造者定義了不同的創建過程,且具體建造者相互獨立,增加新的建造者非常方便,無須修改已有代碼,系統具有較好的擴展性。 建造者模式定義如下: 建造者模式(Builder Pattern):將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一種對象創建型模式。 建造者模式一步一步創建一個復雜的對象,它允許用戶只通過指定復雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。建造者模式結構如圖8-2所示: ![](http://my.csdn.net/uploads/201204/04/1333532291_9501.gif) 圖8-2 建造者模式結構圖 在建造者模式結構圖中包含如下幾個角色: ● Builder(抽象建造者):它為創建一個產品Product對象的各個部件指定抽象接口,在該接口中一般聲明兩類方法,一類方法是buildPartX(),它們用于創建復雜對象的各個部件;另一類方法是getResult(),它們用于返回復雜對象。Builder既可以是抽象類,也可以是接口。 ●ConcreteBuilder(具體建造者):它實現了Builder接口,實現各個部件的具體構造和裝配方法,定義并明確它所創建的復雜對象,也可以提供一個方法返回創建好的復雜產品對象。 ●Product(產品角色):它是被構建的復雜對象,包含多個組成部件,具體建造者創建該產品的內部表示并定義它的裝配過程。 ● Director(指揮者):指揮者又稱為導演類,它負責安排復雜對象的建造次序,指揮者與抽象建造者之間存在關聯關系,可以在其construct()建造方法中調用建造者對象的部件構造與裝配方法,完成復雜對象的建造。客戶端一般只需要與指揮者進行交互,在客戶端確定具體建造者的類型,并實例化具體建造者對象(也可以通過配置文件和反射機制),然后通過指揮者類的構造函數或者Setter方法將該對象傳入指揮者類中。 在建造者模式的定義中提到了復雜對象,那么什么是復雜對象?簡單來說,復雜對象是指那些包含多個成員屬性的對象,這些成員屬性也稱為部件或零件,如汽車包括方向盤、發動機、輪胎等部件,電子郵件包括發件人、收件人、主題、內容、附件等部件,一個典型的復雜對象類代碼示例如下: ``` class Product { private String partA; //定義部件,部件可以是任意類型,包括值類型和引用類型 private String partB; private String partC; //partA的Getter方法和Setter方法省略 //partB的Getter方法和Setter方法省略 //partC的Getter方法和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()方法,通過調用Product的setPartX()方法可以給產品對象的成員屬性設值。不同的具體建造者在實現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類如何去生成對象,側重于一步步構造一個復雜對象,然后將結果返回。如果將抽象工廠模式看成一個汽車配件生產廠,生成不同類型的汽車配件,那么建造者模式就是一個汽車組裝廠,通過對配件進行組裝返回一輛完整的汽車。 思考 > 如果沒有指揮者類Director,客戶端將如何構建復雜產品?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看