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,哈哈,其实这就是多态了。
    我们可以根据多态调用到对应的子类方法。。。非常方便!

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


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


    当然这样也还是会有缺点的,我们下一次再来分析和改进,也就是我们要讲的策略模式。
  • 相关阅读:
    百度mp3地址解密码
    VB 在EXE后附加信息
    截屏函数
    Base64和StrToByte
    The Android ION memory allocator, DMABUF is mentioned as well
    DDC EDID 介绍
    Memory management for graphic processors TTM的由来
    科普 写display driver的必看 How video card works [2D的四种主要操作]
    GEM vs TTM
    DMABUF 背景介绍文章 Sharing buffers between devices
  • 原文地址:https://www.cnblogs.com/lizb0907/p/aad927a27a86cc6cc86fe11255e65216.html
Copyright © 2011-2022 走看看