`
jgsj
  • 浏览: 1051425 次
文章分类
社区版块
存档分类
最新评论

Java设计模式之从Dota的武器创建分析生成器(Builder)模式

 
阅读更多

  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游戏数据分析程序dota游戏数据分析程序dota游戏数据分析程序...

    java版dota英雄攻略

    用java做的一个dota中108个英雄全图,具体每个英雄的加点物品升级攻略尚需完善

    【最新Dota命令大全】_Dota正常版+AI版+imba版+OMG版命令[参考].pdf

    5.模式随机: -mr/-moderandom 随机从全体随机模式,全选模式,团队随机模式和常规模式中选择一个模式。 联赛模式 1.联赛模式: -lm/-leaguemode 需要 10 个玩家,团队交替选英雄,按(1-2-2-2-2-1)的顺序,第一...

    dota rd模式的整容列表

    在Dota中,RD(Random Draft)模式是一种特殊的游戏模式,玩家通过随机选取英雄来组建团队,增加了游戏的不确定性和趣味性。以下是一些关于RD模式及其整容列表的关键知识点: 1. **随机性**:RD模式的核心在于随机...

    DOTA游戏网站的设计与实现

    《DOTA游戏网站的设计与实现》是一份基于Java技术的学生毕业设计项目,旨在构建一个集信息展示、社区交流和游戏资源分享于一体的DOTA游戏主题网站。这个项目充分展示了开发者对于Web开发技术的掌握,以及对DOTA游戏...

    dota imba常用模式

    IM模式是DOTA IMBA的核心特色之一,它允许玩家在游戏中使用经过平衡调整后的超能力英雄。这些英雄往往拥有比标准DOTA英雄更强大的技能和属性,使得游戏更加刺激和不可预测。 #### 5. AP(All Pick) 全选模式让...

    Dota英雄查询器

    《Dota英雄查询器》是一款专为编程爱好者和Dota玩家设计的实用工具,它集成了丰富的Dota游戏资源,使用户在忙碌的编码工作之余,也能轻松查询Dota英雄的相关信息,为游戏休闲时间提供便利。这款查询器旨在帮助用户在...

    Dota2游戏数据分析(源码+项目说明).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。...Dota2游戏数据分析(源码+项目说明).zip

    php设计模式之抽象工厂模式分析【星际争霸游戏案例】

    抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。在面向对象编程中,抽象工厂模式属于比较高级的模式,主要用于处理对象创建的复杂性问题。在分析...

    DOTA_devkit-master_遥感数据集DOTA处理程序_

    在遥感图像分析领域,DOTA(Detection of Objects in Aerial Images)数据集是一个广泛使用的资源,它包含了大量的航空图像,旨在推动对象检测技术的发展。DOTA_devkit-master是针对该数据集的一套处理程序,帮助...

    java手机游戏设计基础

    在Java手机游戏设计基础这个主题中,我们主要探讨的是如何使用Java编程语言来开发移动设备上的游戏应用。Java因其跨平台性、强大的类库支持以及面向对象的特性,成为手机游戏开发的常用语言之一。本教程将通过一个或...

    Dota英雄连连看

    开发者可能采用了MVC(模型-视图-控制器)设计模式,将业务逻辑、数据处理和用户界面分离,提高了代码的可读性和可维护性。 生产者消费者程序和内存分配程序示例是Java并发编程的重要示例。在多线程环境下,生产者...

    DOTA图标 DOTA 英雄图标 物品图标 技能图标 搞笑图标 搞笑头像

    解压后,开发者可以自由地在他们的项目中使用这些图标,无论是创建游戏模拟器、数据分析工具、社区论坛,还是设计与DOTA相关的移动应用,都能极大地提升用户体验。 在实际应用这些图标时,开发者需要注意版权问题,...

    使用yolo进行DOTA数据库训练,基于DOTA数据集的yolo训练-DOTA-YOLOv3.zip

    文件"DOTA database training with yolo"可能是一个详细的训练指南或教程,包含了从数据预处理到模型训练的全部步骤,帮助研究人员快速上手。同时,这个文件可能还包含了一些训练技巧和调参建议,使得研究者能够更快...

    Hexagen:用于Dota 2自定义游戏的六边形网格生成器

    Hexagen是用于Dota 2自定义游戏的六角形网格生成器,已编程为lua库 Hexagen生成一个放射状的六角形网格供您在Dota 2自定义游戏中使用。 使用Hexagen,您可以创建任何大小的网格,并轻松地对其进行迭代和寻路操作。 ...

    DOTA_HERO.rar_hero_hero g3 sqlserv_java sqlServer_查询数据库

    总的来说,"DOTA_HERO.rar_hero_hero g3_sqlserv_java sqlServer_查询数据库"这个主题为我们提供了一个学习JAVA与SQLServer交互的实例,通过这个项目,我们可以了解如何在JAVA程序中设计数据模型,建立数据库连接,...

    最新Dota命令大全Dota正常版+AI版+imba版+OMG版命令.doc

    * -mr/-moderandom:模式随机,随机从全体随机模式,全选模式,团队随机模式和常规模式中选择一个模式 * -lm/-leaguemode:联赛模式,需要 10 个玩家,团队交替选英雄 * -rd/-randomdraft:随机征召模式,22 个随机...

    Dota2-wrapper:DotA2 WebAPI 的 Java 包装器

    DotA2-包装器用 Java 编写的 DotA2 WebAPI 的包装器。 它极大地简化了执行自动 API 请求以及组合响应并将它们反序列化为 Java 对象的过程。 它还提供了许多附加功能,例如通过 Dotabuff 搜索玩家和检索 Steam 社区...

Global site tag (gtag.js) - Google Analytics