- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 原型模式(PROTOTYPE)
游戏角色设计
三国系列游戏中上百位英雄的头像基本上很相似?
研究表明: 人类的脸谱基本上只有有限几个类型,只不过在细节和组合方面存在些差异
游戏制作者依据这个理论,只对人脸进行有限的几种建模,然后再通过组合、修饰,就可以产生无数的头像
游戏角色设计
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节
每一个类都必须配备一个克隆方法(缺点)
Java和.net均提供对原型模式的直接支持
原型模式定义
在面向对象系统中,使用原型模式来复制一个对象自身,从而克隆出多个与原型对象一模一样的对象。
在软件系统中,有些对象的创建过程较为复杂,而有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在。
原型模式动机
简单形式的原始模型模式的UML类图
登记形式的原始模型模式的UML类图
客户(Client)角色:客户端类向管理员提出创建对象的请求
抽象原型(Prototype)角色:此角色给出所有的具体原型类所需的接口
具体原型(ConcretePrototype)角色:被复制的对象。此角色需要实现抽象原型角色所需要的接口。
原型管理器(PrototypeManager)角色:创建具体原型类的对象,并记录每一个被创建的对象
要创建的原型对象数目较少且比较固定,采取简单形式的原始模型模式。
要创建的原型对象数目不固定的话,采取登记形式的原始模型模式。
两种形式的比较
工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。
实现主要是复制(克隆),有两种方式: 浅复制(浅克隆)和深复制(深克隆)
原型模式
浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍指向原来的对象。
本质:
浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
原型模式
深复制(深克隆)
深复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。
本质:
深复制把要复制的对象所引用的对象都复制了一遍,而这种对被引用到的对象的复制叫作间接复制。
原型模式
深复制(深克隆)
深复制要深入到多少层,是一个不易确定的问题。在决定以深复制的方式复制一个对象的时候,必须决定对间接复制的对象是采用浅复制还是继续采用深复制。
在采用深复制时,需要决定多深才算深。此外,在深复制的过程中,很可能会出现循环引用的问题,必须小心处理。
原型模式
深克隆
浅克隆
原型模式
Java类都继承自java.lang.Object,而Object类提供一个clone()方法
实现克隆的Java类必须实现标识接口Cloneable。如果一个类没有实现这个接口但调用clone()方法,Java编译器将抛出CloneNotSupportedException异常。
Cloneable接口中有一Clone方法,可以在类中重载实现自定义的克隆方法。
原型模式
原型模式
public class PrototypeDemo implements Cloneable{
public Object clone(){
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println(Not support cloneable);
}
return object;
}
……
}
Java: 一般而言,clone()方法满足:
(1) 对任何的对象x,都有x.clone() !=x,即克隆对象与原对象不是同一个对象
(2) 对任何的对象x,都有
x.clone().getClass()==x.getClass(),即克隆对象与原对象的类型一样
(3)如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
原型模式
浅拷贝与深拷贝
public class Lay2 implements Cloneable {
public int y;
public L
public Object clone() {
Object clone = nul
您可能关注的文档
- 第06章第二节冲击式粉碎机要点.ppt
- 第30课时通过激素的调节神经调节与体液调节的关系要点.ppt
- 第06章生物药剂学要点.pptx
- 第06章食物中各化学物质毒理学要点.ppt
- 第30章.动物多样性的进化要点.ppt
- 第06章树和二叉树(Java版)要点.ppt
- 第30章肝脏疾病病人的护理要点.ppt
- 第6次课内容-第四章五官科病症2要点.pptx
- 第31讲种群的特征和数量变化(自己编写)公开课要点.ppt
- 第31课一次成功的实验要点.ppt
- 2-红河州建筑施工安全生产标准化工地复核评分表(2022年修改版).docx
- 6.锡通项目2018年下半年工作会汇报材料(2018.7.9).docx
- 2018道路工程知识点汇总(新版).docx
- 附件3:月度生产例会安全汇报资料-站台门项目部.docx
- 附件2:广东建工集团2018年度科技成果汇总表.DOC
- 马武停车区、三汇停车区停车位管理系统,0#台账缺量.doc
- 攀成钢委办发〔2015〕19号(党风廉政建设责任考核与追究办法).doc
- 1-红河州建筑工程质量管理标准化复核评分表(2022年修改版).docx
- 中交第三公路工程局第四工程分公司项目经济合同结算管理办法(修订).doc
- 厂站安全操作规程汇编.doc
文档评论(0)