複雜物件的組裝與建立——建造者模式(二)
8.3 完整解決方案
Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示:
圖8-3 遊戲角色建立結構圖
在圖8-3中,ActorController充當指揮者,ActorBuilder充當抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充當具體建造者,Actor充當複雜產品。完整程式碼如下所示:
//Actor角色類:複雜產品,考慮到程式碼的可讀性,只列出部分成員屬性,且成員屬性的型別均為String,真實情況下,有些成員屬性的型別需自定義 class Actor { private String type; // private String sex; //性別 private String face; //臉型 private String costume; //服裝 private String hairstyle; //髮型 public void setType(String type) { this.type = type; } public void setSex(String sex) { this.sex = sex; } public void setFace(String face) { this.face = face; } public void setCostume(String costume) { this.costume = costume; } public void setHairstyle(String hairstyle) { this.hairstyle = hairstyle; } public String getType() { return (this.type); } public String getSex() { return (this.sex); } public String getFace() { return (this.face); } public String getCostume() { return (this.costume); } public String getHairstyle() { return (this.hairstyle); } } //角色建造器:抽象建造者 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 createActor() { return actor; } } //英雄角色建造器:具體建造者 class HeroBuilder 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("飄逸"); } } //天使角色建造器:具體建造者 class AngelBuilder 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("披肩長髮"); } } //惡魔角色建造器:具體建造者 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("光頭"); } } |
指揮者類ActorController定義了construct()方法,該方法擁有一個抽象建造者ActorBuilder型別的引數,在該方法內部實現了遊戲角色物件的逐步構建,程式碼如下所示:
//遊戲角色建立控制器:指揮者 class ActorController { //逐步構建複雜產品物件 public Actor construct(ActorBuilder ab) { Actor actor; ab.buildType(); ab.buildSex(); ab.buildFace(); ab.buildCostume(); ab.buildHairstyle(); actor=ab.createActor(); return actor; } } |
為了提高系統的靈活性和可擴充套件性,我們將具體建造者類的類名儲存在配置檔案中,並通過工具類XMLUtil來讀取配置檔案並反射生成物件,XMLUtil類的程式碼如下所示:
import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; class XMLUtil { //該方法用於從XML配置檔案中提取具體類類名,並返回一個例項物件 public static Object getBean() { try { //建立文件物件 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("config.xml")); //獲取包含類名的文字節點 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通過類名生成例項物件並將其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } } |
配置檔案config.xml中儲存了具體建造者類的類名,程式碼如下所示:
<?xml version="1.0"?> <config> <className>AngelBuilder</className> </config> |
編寫如下客戶端測試程式碼:
class Client { public static void main(String args[]) { ActorBuilder ab; //針對抽象建造者程式設計 ab = (ActorBuilder)XMLUtil.getBean(); //反射生成具體建造者物件 ActorController ac = new ActorController(); Actor actor; actor = ac.construct(ab); //通過指揮者建立完整的建造者物件 String type = actor.getType(); System.out.println(type + "的外觀:"); System.out.println("性別:" + actor.getSex()); System.out.println("面容:" + actor.getFace()); System.out.println("服裝:" + actor.getCostume()); System.out.println("髮型:" + actor.getHairstyle()); } } |
編譯並執行程式,輸出結果如下:
天使的外觀: 性別:女 面容:漂亮 服裝:白裙 髮型:披肩長髮 |
在建造者模式中,客戶端只需例項化指揮者類,指揮者類針對抽象建造者程式設計,客戶端根據需要傳入具體的建造者型別,指揮者將指導具體建造者一步一步構造一個完整的產品(逐步呼叫具體建造者的buildX()方法),相同的構造過程可以建立完全不同的產品。在遊戲角色例項中,如果需要更換角色,只需要修改配置檔案,更換具體角色建造者類即可;如果需要增加新角色,可以增加一個新的具體角色建造者類作為抽象角色建造者的子類,再修改配置檔案即可,原有程式碼無須修改,完全符合“開閉原則”。
相關推薦
複雜物件的組裝與建立——建造者模式(二)
8.3 完整解決方案 Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示: 圖8-3 遊戲角色建立結構圖 在圖8-3中,ActorCont
建造者模式-Builder Pattern 複雜物件的組裝與建立——建造者模式(二):遊戲角色設計的建造者模式解決方案
8.3 完整解決方案 Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示: 圖8-3 遊戲角色建立結構圖 在圖8-3中,Ac
複雜物件的組裝與建立——建造者模式(三)
8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build
建造者模式-Builder Pattern 複雜物件的組裝與建立——建造者模式(三):關於Director的進一步討論,建造者模式總結
8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build
複雜物件的組裝與建立——建造者模式(一)
沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的建立型模式。建造
複雜物件的組裝與建立——建造者模式(一):遊戲角色設計,模式概述
沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的建立型模式。建造者
複雜物件的建立--建造者模式(Builder)
1初識建造者模式 建造者模式實際上是常用的設計模式。顧名思義,builder的意思是建造者或者建築工人,談到建造自然會想到樓房。樓房是千差萬別的,樓房的外形、層數、內部房間的數量、房間的裝飾等等都不一樣,但是對於建造者來說,抽象出來的建築流程是確定的,往往建築
【Unity3D與23種設計模式】建造者模式(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充當目
協調多個物件之間的互動——中介者模式(一)
騰訊公司推出的QQ作為一款免費的即時聊天軟體深受廣大使用者的喜愛,它已經成為很多人學習、工作和生活的一部分(不要告訴我你沒有QQ哦,)。在QQ聊天中,一般有兩種聊天方式:第一種是使用者與使用
協調多個物件之間的互動——中介者模式(三)
20.3 完整解決方案 為了協調介面元件物件之間的複雜互動關係,Sunny公司開發人員使用中介者模式來設計客戶資訊管理視窗,其結構示意圖如圖20-7所示:圖20-7 引入了中介者類的“客戶資訊