<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 復雜對象的組裝與創建——建造者模式(二) 8.3 完整解決方案 Sunny公司開發人員決定使用建造者模式來實現游戲角色的創建,其基本結構如圖8-3所示: ![](http://my.csdn.net/uploads/201204/04/1333541212_6038.gif) 圖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()方法),相同的構造過程可以創建完全不同的產品。在游戲角色實例中,如果需要更換角色,只需要修改配置文件,更換具體角色建造者類即可;如果需要增加新角色,可以增加一個新的具體角色建造者類作為抽象角色建造者的子類,再修改配置文件即可,原有代碼無須修改,完全符合“開閉原則”。
                  <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>

                              哎呀哎呀视频在线观看