8.3完整解决方案

Sunny公司开发人员决定使用建造者模式来实现游戏角色的创建,其基本结构如图8-3所示:

图8-3 游戏角色创建结构图

在图8-3中,ActorController充当指挥者,ActorBuilder充当抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充当具体建造者,Actor充当复杂产品。完整代码如下所示:

指挥者类ActorController定义了construct()方法,该方法拥有一个抽象建造者ActorBuilder类型的参数,在该方法内部实现了游戏角色对象的逐步构建,代码如下所示:

//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("光头");}
}
//游戏角色创建控制器:指挥者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();<span style="font-family:Times New Roman;">D</span>ocumentBuilder  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()方法),相同的构造过程可以创建完全不同的产品。在游戏角色实例中,如果需要更换角色,只需要修改配置文件,更换具体角色建造者类即可;如果需要增加新角色,可以增加一个新的具体角色建造者类作为抽象角色建造者的子类,再修改配置文件即可,原有代码无须修改,完全符合“开闭原则”。

【作者:刘伟 http://blog.csdn.net/lovelio】

建造者模式(二):游戏角色设计的建造者模式解决方案相关推荐

  1. 复杂对象的组装与创建——建造者模式(一):游戏角色设计,建造者模式概述

    没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎.方向盘和发动机等多个部件的完整汽车.如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题.建造者模式又称为生成器模 ...

  2. 设计模式——装饰者(Decorator)模式DEMO——游戏角色的装饰者模式实现

    问题描述 游戏中,角色Character可以有属性attack, defence,可以有装备weapen, armour,可以对属性造成影响,它们可以是类的属性:可以随时变成巨人gigantize,可 ...

  3. 例说游戏角色设计与角色文化内涵的关系

    2019独角兽企业重金招聘Python工程师标准>>> 游戏角色设计不仅仅是用视觉美术上的设计表达出策划的文案设计,而是在游戏角色上赋予其世界观.人物性格.职业.经历等,可以这样说, ...

  4. 游戏建模中的低模角色模型如何制作?游戏角色设计流程介绍

    随着游戏行业的飞速发展,很多人都想要学习游戏制作知识,那么你知道游戏低模角色是怎么制作的呢?下面是游戏低模角色制作教程,一起来学习吧! 次世代建模多是运用3D Max以及Zbrush软件进行次世代高模 ...

  5. 从一个角色建模师角度谈谈游戏角色设计

    大部分新人在进入原画行业时总会被华丽的美宣图和各种技法吸引,误认为这就是游戏原画.然而在实际工作中,更加注重的是设计本身,炫酷的技法只是建立在设计基础上的加分项.首先需要明白设计的目的是服务于工作,2 ...

  6. 暴雪艺术家谈游戏角色设计技巧

    Nathan Brock,现就职于暴雪游戏(Blizzard),他分享了游戏角色设计的一些技巧以及知识点,包括材质流程.低模阶段,最后还简单介绍了如何为最终的模型加入一些有趣的点. 以下为分享正文: ...

  7. 进行游戏角色设计 设计要领必须要掌握

    进行游戏角色设计 设计要领必须要掌握 [导语]游戏原画设计里很重要的一部分就是角色设计,游戏原画师在设计角色原画的时候,有很多游戏角色设计要领需要掌握好,这也是保证游戏设计的顺利进行,并能达到想要的效 ...

  8. 一文弄懂Java设计模式之建造者模式:图解+游戏角色生成实例

    文章目录 详解Java设计模式之建造者模式 案例引入建造者模式 建造者模式 定义 UML类图表示 模式结构 案例分析与代码实现 案例类图实现 代码结构 代码实现 结果分析 指挥者类的深入讨论 钩子方法 ...

  9. android策略模式_Android游戏开发–设计游戏实体–策略模式

    android策略模式 在这一部分中,我将尝试解释我对好的游戏设计元素的理解. 我将在示例中使用droid,并编写基本的战斗模拟器脚本以查看其行为. 问题: 我指挥一个机器人,我想消灭敌人. 再次面对 ...

  10. 设计模式之策略模式(strategy)--游戏角色使用武器

    策略模式:定义了算法族,并且让算法之间可以相互替换,它可以将算法实现和算法的使用客户独立. 转载于:https://www.cnblogs.com/beyondwcm/archive/2007/11/ ...

最新文章

  1. Python组合数据类型之字典类型
  2. gradle配置及使用教程、groovy入门示例
  3. 论文浅尝 | 探索将预训练语言模型用于事件抽取和事件生成
  4. python pandas 日期_python+pandas+时间、日期以及时间序列处理方法
  5. 图灵奖得主Bengio:深度学习让AI得以推理和想象,不会被取代
  6. 韩国冬奥:未来科技奥运我要长这样,阿里巴巴:你尽管想
  7. linux下多版本opencv共存问题
  8. bzoj 3672 利用点分治将CDQ分治推广到树型结构上
  9. 辽宁移动客服呼叫中心两级质检管理效果佳
  10. Linux系统下安装中文输入法
  11. 佳能mp288清零软件,非常好用@
  12. java手机验证码注册_Java手机验证码注册
  13. 安卓判断手机GPS是否打开,未打开时跳去手机设置开启GPS的方法
  14. linux OS与SQL修改时区,系统时间
  15. CSS transform属性的简单应用——双开门动画效果
  16. 数组和ArrayList的区别
  17. 杰理之设置恒流充电电流【篇】
  18. pac文件提取服务器,[工具使用] privoxy 实现 PAC 请求过滤
  19. 高温高湿环境人体热负荷预警仿真模型
  20. 备考通信复试过程中的一些知识点总结梳理——信道编码

热门文章

  1. 计算机主机序列,SCCM任务序列自动根据SN号命名计算机
  2. 【最全】latex与word之间的各种转化方法和软件汇总
  3. unity篇-官方序列化接口 ISerializationCallbackReceiver
  4. AMD录用前IBM中国总裁周伟焜为公司董事会成员
  5. 上周刚号召加班,这周立马双休,董明珠把互联网玩明白了……
  6. 手脱ASPack v2.12
  7. 计算机网络cs144之lab0
  8. 网安学习——信息收集
  9. 听比喻,懂原理(1)超五类双绞线和六类双绞线的区别
  10. 英特尔芯片组系列 服务器,Intel 7系列芯片组正式发布 不同型号解析