Dota可谓是当下最流行的游戏之一,玩家分为两队,分别是天辉(近卫)和夜魇(天灾),每队5个人,通过补刀、杀敌获取经验和金钱,金钱可用来购买强大的武器,最终推倒敌方基地则获胜。我们现在考虑一个最简单的武器组成元素:武器是由武器名、攻击力、武器颜色组成,我们要想办法实现能够新建各种各样武器的一个模式。假设我们预设了两种武器,分别是圣剑(攻击力300,黄色)、圣者遗物(攻击力60,蓝色),我将试着用生成器模式来做一个武器的生成小框架。
生成器模式的意图是将一个复杂对象与它的表示分离,使得同样的构建过程可以创建不同的表示。
我们将生成武器的抽象过程提取出来: 定义一个武器基类,包含武器名、攻击力、颜色,以及打印武器信息的方法;然后我们通过为武器命名并赋予攻击力值、颜色来完成一个武器的生成,最后将生成的武器返回。Java代码如下:
class Weapon{
private String color;
private String name;
private int attack;
public String getName(){
return name;
}
public int getAttack(){
return attack;
}
public String getColor(){
return color;
}
public void setAttack(int _attack){ attack = _attack;}
public void setName(String _name){ name = _name;}
public void setColor(String _color){ color = _color;}
public void print(){
System.out.printf("武器名: %s, 攻击力: %d, 颜色: %s\n", name, attack, color);
}
}
interface WeaponBuilder {
void buildBasicInformation();
void buildColor();
Weapon getWeapon();
}
class Weapons
{
public static void build(WeaponBuilder builder){
builder.buildBasicInformation();
builder.buildColor();
}
}
class DivineRapierBuilder implements WeaponBuilder{
private Weapon weapon = new Weapon();
public void buildBasicInformation(){
weapon.setName("圣剑");
weapon.setAttack(300);
}
public void buildColor(){
weapon.setColor("黄色");
}
public Weapon getWeapon(){
return weapon;
}
}
class SacredRelicBuilder implements WeaponBuilder{
private Weapon weapon = new Weapon();
public void buildBasicInformation(){
weapon.setName("圣者遗物");
weapon.setAttack(60);
}
public void buildColor(){
weapon.setColor("蓝色");
}
public Weapon getWeapon(){
return weapon;
}
}
class Builder
{
public static void main(String[] args) {
WeaponBuilder divineRapierBuilder = new DivineRapierBuilder();
Weapons.build(divineRapierBuilder);
WeaponBuilder sacredRelicBuilder = new SacredRelicBuilder();
Weapons.build(sacredRelicBuilder);
Weapon divineRapier = divineRapierBuilder.getWeapon();
Weapon sacredRelic = sacredRelicBuilder.getWeapon();
divineRapier.print();
sacredRelic.print();
}
}
输出结果为:
武器名: 圣剑, 攻击力: 300, 颜色: 黄色
武器名: 圣者遗物, 攻击力: 60, 颜色: 蓝色
下面简要来分析一下上面的代码。Weapon类是记录武器信息的一个类,我们最终就是要返回一个我们需要的Weapon对象。这个Weapon对象是一个比较复杂的对象,它由名称和攻击力两个部分组成,我们把生成一个武器的必要方法声明在WeaponBuilder接口中,接下来为圣剑、圣者遗物两个武器实现方法(分别是DivineRapierBuilder类和SacredRelicBuilder类)。最后,我们定义一个制造武器的类Weapons,里面的静态方法build传入了一个WeaponBuilder对象,它会调用此对象的build,并返回getWeapon作为结果。如main方法中所写的那样,我们总是可以调用Weapons.build来创建一个新的武器,Weapons本身并不创建武器,主要依靠的是传入的WeaponBuilder来创建。如果我们需要建立一个新武器,我们只需要构造一个继承了WeaponBuilder接口的类即可。
在设计模式一书中谈到,抽象工厂模式与Builder模式类似,都可以创建复杂对象;区别是Builder模式着重于一步步构造一个复杂对象,而抽象工厂着重于多个系列产品对象的创建(如上一篇博客的ProduceMarine、ProduceFirebat等),Builder在最后一步返回产品,而抽象工厂是立即返回的。
分享到:
相关推荐
这在设计模式中称为策略组合,通过将多个策略对象组合使用,可以创建出复杂的战术策略。例如,“冰女”的“霜冻新星”和“冰封路径”组合,可以有效控制敌方英雄的移动并造成大量伤害。 此外,DOTA中的物品也采用了...
dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序...
用java做的一个dota中108个英雄全图,具体每个英雄的加点物品升级攻略尚需完善
5.模式随机: -mr/-moderandom 随机从全体随机模式,全选模式,团队随机模式和常规模式中选择一个模式。 联赛模式 1.联赛模式: -lm/-leaguemode 需要 10 个玩家,团队交替选英雄,按(1-2-2-2-2-1)的顺序,第一...
在Dota中,RD(Random Draft)模式是一种特殊的游戏模式,玩家通过随机选取英雄来组建团队,增加了游戏的不确定性和趣味性。以下是一些关于RD模式及其整容列表的关键知识点: 1. **随机性**:RD模式的核心在于随机...
《DOTA游戏网站的设计与实现》是一份基于Java技术的学生毕业设计项目,旨在构建一个集信息展示、社区交流和游戏资源分享于一体的DOTA游戏主题网站。这个项目充分展示了开发者对于Web开发技术的掌握,以及对DOTA游戏...
IM模式是DOTA IMBA的核心特色之一,它允许玩家在游戏中使用经过平衡调整后的超能力英雄。这些英雄往往拥有比标准DOTA英雄更强大的技能和属性,使得游戏更加刺激和不可预测。 #### 5. AP(All Pick) 全选模式让...
《Dota英雄查询器》是一款专为编程爱好者和Dota玩家设计的实用工具,它集成了丰富的Dota游戏资源,使用户在忙碌的编码工作之余,也能轻松查询Dota英雄的相关信息,为游戏休闲时间提供便利。这款查询器旨在帮助用户在...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。...Dota2游戏数据分析(源码+项目说明).zip
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。在面向对象编程中,抽象工厂模式属于比较高级的模式,主要用于处理对象创建的复杂性问题。在分析...
在遥感图像分析领域,DOTA(Detection of Objects in Aerial Images)数据集是一个广泛使用的资源,它包含了大量的航空图像,旨在推动对象检测技术的发展。DOTA_devkit-master是针对该数据集的一套处理程序,帮助...
在Java手机游戏设计基础这个主题中,我们主要探讨的是如何使用Java编程语言来开发移动设备上的游戏应用。Java因其跨平台性、强大的类库支持以及面向对象的特性,成为手机游戏开发的常用语言之一。本教程将通过一个或...
开发者可能采用了MVC(模型-视图-控制器)设计模式,将业务逻辑、数据处理和用户界面分离,提高了代码的可读性和可维护性。 生产者消费者程序和内存分配程序示例是Java并发编程的重要示例。在多线程环境下,生产者...
解压后,开发者可以自由地在他们的项目中使用这些图标,无论是创建游戏模拟器、数据分析工具、社区论坛,还是设计与DOTA相关的移动应用,都能极大地提升用户体验。 在实际应用这些图标时,开发者需要注意版权问题,...
文件"DOTA database training with yolo"可能是一个详细的训练指南或教程,包含了从数据预处理到模型训练的全部步骤,帮助研究人员快速上手。同时,这个文件可能还包含了一些训练技巧和调参建议,使得研究者能够更快...
Hexagen是用于Dota 2自定义游戏的六角形网格生成器,已编程为lua库 Hexagen生成一个放射状的六角形网格供您在Dota 2自定义游戏中使用。 使用Hexagen,您可以创建任何大小的网格,并轻松地对其进行迭代和寻路操作。 ...
总的来说,"DOTA_HERO.rar_hero_hero g3_sqlserv_java sqlServer_查询数据库"这个主题为我们提供了一个学习JAVA与SQLServer交互的实例,通过这个项目,我们可以了解如何在JAVA程序中设计数据模型,建立数据库连接,...
* -mr/-moderandom:模式随机,随机从全体随机模式,全选模式,团队随机模式和常规模式中选择一个模式 * -lm/-leaguemode:联赛模式,需要 10 个玩家,团队交替选英雄 * -rd/-randomdraft:随机征召模式,22 个随机...
DotA2-包装器用 Java 编写的 DotA2 WebAPI 的包装器。 它极大地简化了执行自动 API 请求以及组合响应并将它们反序列化为 Java 对象的过程。 它还提供了许多附加功能,例如通过 Dotabuff 搜索玩家和检索 Steam 社区...