先来学习下简单工厂模式!
我们知道在游戏里有很多的场景,例如:帮派场景,副本场景,野外场景...
现在我们有这样的需求:
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,哈哈,其实这就是多态了。

我们可以根据多态调用到对应的子类方法。。。非常方便!

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


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


当然这样也还是会有缺点的,我们下一次再来分析和改进,也就是我们要讲的策略模式。

java游戏服务器--简单工厂模式的更多相关文章

  1. Java中的简单工厂模式

    举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...

  2. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...

  3. (1)java设计模式之简单工厂模式

    一:简单工厂模式的优点          --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...

  4. 设计模式(Java语言)- 简单工厂模式

    简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...

  5. Java 设计模式01 - 简单工厂模式

    先要学习设计模式之前的先看看一些基础 UML类图简单说明 可以先看看我的这篇博客: UML类图简单说明,学习编程思路的必会技能 接下来才是重点,开始我们的旅程吧. 一.UML类图展示 我们要用简单工厂 ...

  6. Java设计模式(1)——简单工厂模式

    简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 一.模式中包含的角色及其职责 1.工厂(Creator)角色 简单 ...

  7. Java 设计模式之 简单工厂模式(静态工厂方法模式)

    简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的 ...

  8. java设计模式之简单工厂模式

    简单工厂: 简单工厂的优点: 1.去除客户端与具体产品的耦合,在客户端与具体的产品中增加一个工厂类,增加客户端与工厂类的耦合 2.封装工厂类,实现代码平台的复用性,创建对象的过程被封装成工厂类,可以多 ...

  9. Java面向对象_简单工厂模式

    概念:由一个工厂对象决定创建出哪一种产品类的实例. public class Practice14 { public static void main(String[] args) { // TODO ...

随机推荐

  1. LocalDatetime 与 mybatis、json的坑

    总所周知,localdatetime是jdk8 推出的关于日期计算非常方便地一个类,一旦开始用上就欲罢不能.但是在使用的时候,坑还是蛮多的. 一.mybatis与LocalDatetime 如果直接将 ...

  2. JS 深拷贝/合并

    var mix = function(r, s, ov) { if (!s || !r) return r; if (ov === undefined) ov = true; for (var p i ...

  3. centos7 nginx 代理

    2019/06/05 15:00:23 [crit] 4332#4332: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) ...

  4. JAVA笔记2-面向对象与内存解析

    1.java中的变量先声明.再赋值.再使用.(局部变量必须初始化,成员变量默认初始化) 2.基本类型之外的所有类型都是引用类型.基本类型占一块内存,引用类型占两块(所有new出来的东西装在堆内存,因为 ...

  5. oracle-linux7 镜像地址 secuCRT 注册-linux内核

    http://mirrors.dotsrc.org/oracle-linux/OL7/u4/x86_64/ secuCRT 注册 https://github.com/hanxianzhai/Secu ...

  6. php重写与重载

    转载:https://blog.csdn.net/binghui1990/article/details/9105237 重写/覆盖 override   指:子类重写了父类的同名方法 (注:1.重写 ...

  7. maven项目创6 表现层整合

    springmvc.xm创建l 和 web.xml配置    ,报错先不管 springmvc.xml com.taotao.controller   空包 其中    资源映射   是等 web.x ...

  8. F - Almost Sorted Array

    F - Almost Sorted Array   We are all familiar with sorting algorithms: quick sort, merge sort, heap ...

  9. JavaWeb_初识监听器Listener

    监听器(listener):对项目起到监听的作用,它能感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化 监听器是Servlet规范中 ...

  10. Jmeter -- 同步定时器

    作用: 模拟并发. 设置一个阀值(请求数量),当请求数达到这个阀值时,允许请求同时发出.例如:想测试一座桥的并发(忽略载重等其他因素,只考虑通过),那么并发的请求就是类似于多少辆车可同时通过桥,而车辆 ...