建造者模式(二):游戏角色设计的建造者模式解决方案
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】
建造者模式(二):游戏角色设计的建造者模式解决方案相关推荐
- 复杂对象的组装与创建——建造者模式(一):游戏角色设计,建造者模式概述
没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎.方向盘和发动机等多个部件的完整汽车.如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题.建造者模式又称为生成器模 ...
- 设计模式——装饰者(Decorator)模式DEMO——游戏角色的装饰者模式实现
问题描述 游戏中,角色Character可以有属性attack, defence,可以有装备weapen, armour,可以对属性造成影响,它们可以是类的属性:可以随时变成巨人gigantize,可 ...
- 例说游戏角色设计与角色文化内涵的关系
2019独角兽企业重金招聘Python工程师标准>>> 游戏角色设计不仅仅是用视觉美术上的设计表达出策划的文案设计,而是在游戏角色上赋予其世界观.人物性格.职业.经历等,可以这样说, ...
- 游戏建模中的低模角色模型如何制作?游戏角色设计流程介绍
随着游戏行业的飞速发展,很多人都想要学习游戏制作知识,那么你知道游戏低模角色是怎么制作的呢?下面是游戏低模角色制作教程,一起来学习吧! 次世代建模多是运用3D Max以及Zbrush软件进行次世代高模 ...
- 从一个角色建模师角度谈谈游戏角色设计
大部分新人在进入原画行业时总会被华丽的美宣图和各种技法吸引,误认为这就是游戏原画.然而在实际工作中,更加注重的是设计本身,炫酷的技法只是建立在设计基础上的加分项.首先需要明白设计的目的是服务于工作,2 ...
- 暴雪艺术家谈游戏角色设计技巧
Nathan Brock,现就职于暴雪游戏(Blizzard),他分享了游戏角色设计的一些技巧以及知识点,包括材质流程.低模阶段,最后还简单介绍了如何为最终的模型加入一些有趣的点. 以下为分享正文: ...
- 进行游戏角色设计 设计要领必须要掌握
进行游戏角色设计 设计要领必须要掌握 [导语]游戏原画设计里很重要的一部分就是角色设计,游戏原画师在设计角色原画的时候,有很多游戏角色设计要领需要掌握好,这也是保证游戏设计的顺利进行,并能达到想要的效 ...
- 一文弄懂Java设计模式之建造者模式:图解+游戏角色生成实例
文章目录 详解Java设计模式之建造者模式 案例引入建造者模式 建造者模式 定义 UML类图表示 模式结构 案例分析与代码实现 案例类图实现 代码结构 代码实现 结果分析 指挥者类的深入讨论 钩子方法 ...
- android策略模式_Android游戏开发–设计游戏实体–策略模式
android策略模式 在这一部分中,我将尝试解释我对好的游戏设计元素的理解. 我将在示例中使用droid,并编写基本的战斗模拟器脚本以查看其行为. 问题: 我指挥一个机器人,我想消灭敌人. 再次面对 ...
- 设计模式之策略模式(strategy)--游戏角色使用武器
策略模式:定义了算法族,并且让算法之间可以相互替换,它可以将算法实现和算法的使用客户独立. 转载于:https://www.cnblogs.com/beyondwcm/archive/2007/11/ ...
最新文章
- Python组合数据类型之字典类型
- gradle配置及使用教程、groovy入门示例
- 论文浅尝 | 探索将预训练语言模型用于事件抽取和事件生成
- python pandas 日期_python+pandas+时间、日期以及时间序列处理方法
- 图灵奖得主Bengio:深度学习让AI得以推理和想象,不会被取代
- 韩国冬奥:未来科技奥运我要长这样,阿里巴巴:你尽管想
- linux下多版本opencv共存问题
- bzoj 3672 利用点分治将CDQ分治推广到树型结构上
- 辽宁移动客服呼叫中心两级质检管理效果佳
- Linux系统下安装中文输入法
- 佳能mp288清零软件,非常好用@
- java手机验证码注册_Java手机验证码注册
- 安卓判断手机GPS是否打开,未打开时跳去手机设置开启GPS的方法
- linux OS与SQL修改时区,系统时间
- CSS transform属性的简单应用——双开门动画效果
- 数组和ArrayList的区别
- 杰理之设置恒流充电电流【篇】
- pac文件提取服务器,[工具使用] privoxy 实现 PAC 请求过滤
- 高温高湿环境人体热负荷预警仿真模型
- 备考通信复试过程中的一些知识点总结梳理——信道编码