zoukankan      html  css  js  c++  java
  • java游戏服务器简单工厂模式

    先来学习下简单工厂模式!
    我们知道在游戏里有很多的场景,例如:帮派场景,副本场景,野外场景...
    现在我们有这样的需求:
    1.我们需要进入帮派场景时---开始执行帮派任务。
    2.我们需要进入副本场景时---开始打怪。
    3.我们需要进入野外场景时---在河边钓鱼。

    思考下,如何设计?

    我们注意到,这里帮派、副本、野外...其实都是场景,所以我们可以抽象一个场景类出来。然后,你会发现我们要执行帮派任务、打怪、钓鱼其实都是在进入对应的场景时,开始做的事件,到这里,我们自然可以想到“进入场景”其实就是一个方法,这个“进入场景方法”大家都有,只是进入后执行的事件不同而已。帮派、副本、野外就是三个不同的对象。

    建议大家先了解下:多态概念

    接下来开始设计:
    1.建立一个抽象的场景基类(也就是抽象父类,这里也有的方法是建接口),然后它有个抽象方法
    onEnterScene(),也就是大家都有的进入场景方法。
    /**
    * 场景抽象类
    * @author lizhibiao
    * @date 2018/11/29 19:00
    */
    public abstract class AbstractScene
    {
    /**
    * 进入场景方法
    */
    abstract public void onEnterScene();
    }


    2.分别创建副本场景类,帮派场景类,野外场景类(也就是三个对象),继承我们的抽象场景基类AbstractScene,并且覆盖在各自类里覆盖进入场景方法onEnterScene(),然后执行各自的事件。
    /**
    *
    * 副本场景
    *
    * @author lizhibiao
    * @date 2018/11/29 19:06
    */
    public class CopyScene extends AbstractScene
    {

    /**
    * 进入副本场景需要做的事情
    */
    @Override
    public void onEnterScene()
    {
    System.out.println("副本场景---开始打怪");
    }
    }

    /**
    * 帮派场景
    *
    * @author lizhibiao
    * @date 2018/11/29 19:08
    */
    public class GuildScene extends AbstractScene
    {
    /**
    * 进入帮派场景需要做的事情
    */
    @Override
    public void onEnterScene()
    {
    System.out.println("帮派场景--执行帮派任务");
    }
    }

    /**
    * @author lizhibiao
    * @date 2018/11/29 19:13
    */
    public class WildScene extends AbstractScene
    {
    @Override
    public void onEnterScene()
    {
    System.out.println("野外场景---河边钓鱼");
    }
    }



    3.我们创建一个场景枚举类,方便根据枚举类型来创建场景对象
    /**
    * @author lizhibiao
    * @date 2018/11/29 19:21
    */
    public enum SceneTypeEnum
    {
    /**
    * 副本场景
    */
    COPY_SCENE,

    /**
    * 帮派场景
    */
    GUILD_SCENE,

    /**
    * 野外场景
    */
    WILD_SCENE

    }



    4.创建场景工厂类,我们可以根据枚举类型来创建对应的场景对象。
    例如:根据副本枚举类型,创建副本对象。也就是new一个CopyScene()类。
    /**
    * 创建场景工厂类
    * @author lizhibiao
    * @date 2018/11/29 19:14
    */
    public class CreateSceneFactory
    {

    /**
    * 根据枚举类型创建对应的场景
    * @param typeEnum 枚举类型
    * @return 返回场景抽象类
    */
    public static AbstractScene createScene(SceneTypeEnum typeEnum)
    {
    AbstractScene scene = null;
    switch (typeEnum)
    {
    case COPY_SCENE:
    scene = new CopyScene();
    break;
    case GUILD_SCENE:
    scene = new GuildScene();
    break;
    case WILD_SCENE:
    scene = new WildScene();
    break;
    default:
    break;
    }
    return scene;
    }
    }




    5.接下来,我们可以根据上面的设计和多态来巧妙的进行测试了。
    测试类如下:
    /**
    * 测试类
    *
    * @author lizhibiao
    * @date 2018/11/29 19:42
    */
    public class Main
    {
    public static void main(String[] args)
    {
    //创建副本场景
    AbstractScene copyScene = CreateSceneFactory.createScene(SceneTypeEnum.COPY_SCENE);
    //调用进入场景方法
    copyScene.onEnterScene();

    //创建帮派场景
    AbstractScene guildScene = CreateSceneFactory.createScene(SceneTypeEnum.GUILD_SCENE);
    //调用进入场景方法
    guildScene.onEnterScene();

    //创建野外场景
    AbstractScene wildScene = CreateSceneFactory.createScene(SceneTypeEnum.WILD_SCENE);
    //调用进入场景方法
    wildScene.onEnterScene();
    }
    }
    这里我们传入不同的场景枚举类型,然后创建场景工厂类会创建对应的场景,但是你会发现我们返回的是不同场景类型,接受的它却都是抽象父类AbstarctScene,哈哈,其实这就是多态了。
    我们可以根据多态调用到对应的子类方法。。。非常方便!

    输出结果如下:
    副本场景---开始打怪
    帮派场景--执行帮派任务
    野外场景---河边钓鱼


    这是我们做的游戏里利用简单工厂模式的一个小例子,哈哈。
    如果你看懂了,是不是也跟我一样高兴哈。。。
    设计模式其实并不难,如果代码量上来了,你自然会发现,我们为什么要这么设计。


    当然这样也还是会有缺点的,我们下一次再来分析和改进,也就是我们要讲的策略模式。
  • 相关阅读:
    uview int类型数据对required校验不生效
    使用Nexus上传jar包
    centos上使用Selenium
    vue利用checkbox实现页面内容的刷新
    uview this.$u.post 数据格式不是json,报500错误
    nodejs添加某个模块后启动灰屏
    IDEA快捷命令,提高你拔刀的速度
    如何修改Linux服务器日期时间及时区
    使用exe4j生成exe文件并且附带jre运行环境
    写了一个Word和Excel读写有关的小工具,在此记录一下
  • 原文地址:https://www.cnblogs.com/lizb0907/p/aad927a27a86cc6cc86fe11255e65216.html
Copyright © 2011-2022 走看看