Java设计模式之从[魔兽世界副本]分析原型(Prototype)模式
“副本”是网络游戏任务的一种形式,它最初出现于无尽的任务,现在运用得最有名的就是魔兽世界的副本了,我们将它称为副本任务。副本任务一般是一个队伍的人一起闯关的,假设有队伍A、队伍B、队伍C,分别对同一个副本任务发出挑战,他们在副本任务中的行为是不相干的。也就是说,A队伍在副本任务中消灭boss、开启宝箱,不会对B、C两支队伍造成任何影响,B、C同理。因此,“副本”可以理解成,从任务的原型中拷贝,然后给不同的队伍去执行。
现在从“原型模式”来思考一下副本的实现(真正的魔兽世界是如何实现的我不知道)。原型模式的意图是从原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。以魔兽世界中的“死亡矿井”副本为例,它是一个最基本的副本,玩家达到10级就可以接受此副本任务。为了简化模型,我把副本任务的属性分为任务名、敌人数量和难度等级。若玩家进入了一个副本任务,游戏则先会寻找这个副本任务的原型(也就是一个对象),接下来把这个对象复制(clone)一次,再把复制好的对象返回给玩家,告诉玩家:你的副本任务我已经复制好了,由于是从原型中拷贝下来的,所以你在这个任务里怎么样都不会影响到别人。
以下是Java代码:
interface Cloneable{Object clone();
}class Deadmines implements Cloneable {String mapName = "死亡矿井";int enemies ;int difficulty ;public Deadmines(int _difficulty, int _enemies){difficulty = _difficulty;enemies = _enemies;}public Object clone(){return new Deadmines(difficulty, enemies);}public void print(){System.out.printf("副本名: %s, 敌人数目: %d, 难度: %d\n", mapName, enemies, difficulty); }
}class Prototype
{public static void main(String[] args) {Deadmines deadminesPrototype = new Deadmines(10, 200);Deadmines playerDeadmines = (Deadmines)deadminesPrototype.clone();playerDeadmines.print();System.out.println(deadminesPrototype == playerDeadmines);}
}
输出结果:
副本名: 死亡矿井, 敌人数目: 200, 难度: 15
false
稍微说明一下。main方法中的最后一行是用于判断原型和副本是否为同一引用,结果显然是false,因为副本是被拷贝出来的,并不是直接返回原型。通俗地来讲,原型模式就是以一个对象为模板,来构造与它一样的对象。它可以隐藏具体的克隆细节(如我们在使用时只需要调用clone方法,而不需要知道它是怎么clone的)。
另外还要提到的是,在Java中本身就存在Cloneable接口,在上例中我们是自己重新定义了一个Cloneable。另外,Object类中本身也有一个受保护的方法clone,它可用于改写。在Java文档中写道,Object的clone方法没有继承Cloneable接口,如果直接调用,则会触发CloneNotSupportedException异常。能够调用clone方法的对象一定要继承Cloneable接口。(CloneNotSupportedException - if the object's class does not support the Cloneable interface. Subclasses that override the clone method can also throw this exception to indicate that an instance cannot be cloned.)
总结一下,当一个系统应该独立于它产品创建、构成时、实例化的对象是运行时加载(如副本任务)时、为了避免创建一个与产品类层次平行的工厂类层次时、当一个类的实例只能有几个不同状态组合中的一种时,可以考虑使用原型模式。它在Java、C#中得到了广泛的应用。
Java设计模式之从[魔兽世界副本]分析原型(Prototype)模式相关推荐
- 设计模式--原型(Prototype)模式
模式定义 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 类图 应用场景 当代码不应该依赖于需要复制的对象的具体类时 优点 1.以不耦合具体类的情况下克隆对象: 2.避免重复的初始化代 ...
- 初学 Java 设计模式(五):实战原型模式 「英雄联盟齐天大圣-真假猴王」
一.原型模式介绍 1. 解决的问题 主要解决的问题就是创建重复对象,这部分对象内容本身比较复杂,生成过程可能从库中或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间. 2. 定义 原型模式 ...
- Java设计模式学习总结(6)——创建型模式之原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式是实现了一个原型接口,该接口用于创建当前 ...
- Java 设计模式最佳实践:二、创建型模式
原文:Design Patterns and Best Practices in Java 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],采用译后 ...
- JAVA设计模式(21):行为型-迭代器模式(Iterator)
20世纪80年代,那时我家有一台"古老的"电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来换台的 ...
- Java设计模式圣经连载(05)-代理模式
代理模式是一种非常重要的设计模式,在Java语言中有着广泛的应用,包括Spring AOP的核心设计思想,都和代理模式有密切关系. 代理模式主要分两种:一种是静态代理,一种是动态代理.两种代理方式的实 ...
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- Java设计模式(3 / 23):装饰者模式
文章目录 定义 案例1:三点几啦 首次尝试 再次尝试 设计原则:类应该对扩展开放,对修改关闭 尝用装饰者模式 装饰者模式特征 本例的类图 放码过来 饮料类 HouseBlend DarkRoast E ...
- Java设计模式学习总结(15)——行为型模式之责任链模式
责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...
最新文章
- Docker初学3:Docker的常用命令
- python-dotenv的使用
- 04-iOS蓝牙传输数据演示
- 在ios开发中使用 try 和 catch 来捕获错误。
- SAP JAM tag Cloud
- CNN反向传播卷积核翻转
- thinkphp3.22 多项目配置
- 新的自定义控件:TaskProgressView
- 5 年之后,产品经理,没了?
- 【我的物联网成长记12】当物联网遇上边缘计算
- 中科大计算机竞赛夺冠,中科大斩获全国唯一特等奖,力压清华捧得华为毕昇杯...
- mysql从挂了数据怎么恢复_详解MySQL误操作后怎样进行数据恢复
- spark-sql配置并优化
- Java BigDecimal类
- synchronized工作原理剖析(一)
- 华为的人才体系:任正非这样管理19万员工
- 看完这篇解决你99%的运维安全陋习,快别踩坑了!
- Python 之 PyCharm + selenium 163邮箱登录详解
- 衣带渐宽终不悔,为“指针”消得人憔悴(三)
- 最全互联网Linux工作规划!