孙悟空战黄风怪

jeffyan77 2002-12-01 02:17:58

原始模型模式属于对象的创建模式[GOF95]。通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原始模型模式的用意。

从孙大圣的手段谈起
---------------------
孙悟空在与黄风怪的战斗中,“使一个身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一喷,叫声‘变!’变有百十个行者,都是一样打扮,各执一根铁棒,把那怪围在空中。” 换言之,孙悟空可以根据自己的形像,复制出很多“身外之身”来。

老孙的这种身外身的手段在面向对象的设计领域里,叫做原始模型(Prototype)模式。

Java语言的构件模型直接支持原始模型模式。所有的JavaBean都继承自java.lang.Object,而Object类提供一个clone()方法,可以将一个JavaBean对象复制一份;但是这个JavaBean必须实现一个标示接口Cloneable表明这个JavaBean支持复制。如果一个对象没有实现这个接口而调用clone()方法,Java编译器会抛出CloneNotSupportedException异常。(关于标示接口的概念及相关讨论,请见本书的“专题:Java接口”一章。)

Java的所有类都是从java.lang.Object类继承而来;而Object类提供下面的方法对对象进行复制:

protected Object clone()

子类当然也可以把这个方法置换掉,提供满足自己需要的复制方法。对象的复制有一个基本问题,就是对象通常都有对其它的对象的引用;当使用Object类的clone()方法来复制一个对象时,此对象对其它对象的引用也同时会被复制一份。

Java语言提供的Cloneable接口只起一个作用,就是在运行时期通知Java虚拟机可以安全地在这个类上使用clone()方法。通过调用这个clone()方法可以得到一个对象的复制。由于Object类本身并不实现Cloneable接口,因此如果所考虑的类没有实现Cloneable接口时,调用clone()方法会抛出CloneNotSupportedException异常。

系统可以在自己的类里面置换掉java.lang.Object提供的clone()方法,以便控制复制的过程。

克隆满足的条件
-------------
clone()方法将对象复制了一份并返还给调用者。所谓“复制”的含义与clone()方法是怎么实现的有关。一般而言,clone()方法满足以下的描述[BLOCH01]:

第一、对任何的对象x,都有:x.clone() != x;换言之,克隆对象与原对象不是同一个对象;

第二、对任何的对象x,都有:x.clone().getClass == x.getClass(),换言之,克隆对象与原对象的类型一样;

第三、如果对象x的equals()方法是定义恰当的话,那么 x.clone().equals(x)也应当是成立的。

在Java语言的API中,凡是提供了clone()方法的类,都满足上面的这些这些条件。Java语言的设计师在设计自己的clone()方法是,也应当遵守这三个条件。

一般来说,上面的三个条件中的头两个是必需的,而第三个是可选的;本书则推荐读者遵守所有的三个条件。

。。。下略。。。

阎宏博士,写于纽约
《Java与模式》作者
javapatterns@yahoo.com
http://www.WebEndsHere.com
http://www.yesky.com/20011108/203866.shtml
购书请到
http://www.china-pub.com/computers/common/info.asp?id=8182
http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=BB07630282
...全文
93 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeffyan77 2002-12-09
  • 打赏
  • 举报
回复
您的理解是对的,您所提到的,克隆对象和原对象共用同一组属性对象的克隆做法,叫做浅克隆。

仍然使用孙大圣的例子,孙大圣每次复制自己,顺便将自己的虎皮裙、金箍棒也复制了一遍,这样每一个化身都有自己的虎皮裙和金箍棒,而不是公用一个虎皮裙和金箍棒。这种将所引用的对象也复制一份的做法,叫做深克隆。

您不妨读一读我的书《Java与模式》中“原始模型模式”一章,我自信我的书中将这个问题讲得非常风趣和清楚。



阎宏博士,写于纽约
《Java与模式》作者
电子信箱:javapatterns@yahoo.com
个人网站http://www.WebEndsHere.com (已经开通)

买书请到:
蔚蓝书店:http://www.welan.com/book/bookinfo.asp?bookID=23227
新风雨书店:http://www.cnforyou.com/query/bookdetail.asp?viBookCode=7638
jeffsonxl 2002-12-08
  • 打赏
  • 举报
回复
对象的复制有一个基本问题,就是对象通常都有对其它的对象的引用;当使用Object类的clone()方法来复制一个对象时,此对象对其它对象的引用也同时会被复制一份。

这端话中的对其他对象的引用是什么意思?是指那个对象的句柄吗?如果是我认为如果克隆成功后,在克隆后的对象操作改变被引用对象的属性后,那么原来被克隆的对象也会被影响到,因为他和克隆后的对象引用相同的对象,这样何来安全使用clone()方法?不知我的理解的对不对?希望和阎博士探讨
jeffyan77 2002-12-01
  • 打赏
  • 举报
回复
本书是为实践家而作的

本书的重点放在实践,而不是理论。如果您关心的是有没有什么现成的系统设计,可以立即借用到您的下一个项目中去,那么这本书正是您所需要的。

本书讨论了二十几个设计模式,提供了18个专题项目研究,每一个专题研究都是针对某一个有用途的小系统进行设计,并说明为什么需要使用某一个模式,怎么使用这个模式。

比如在讲解单例(Singleton)以及多例(Multiton)模式之后,本书提供了
专题:单例模式与MX记录
专题:多例(Multiton)模式与多语言支持
专题:序列键生成器与单例及多例模式
等三个独立章节讲解三个小系统,它们分别使用了Singleton和Multiton模式。

在装饰(Decorator)模式之后,本书提供了一个独立章节“专题:设计模式在Java I/O中的应用 ”,详细分析了Java I/O中所使用的装饰模式和适配器模式。

在代理(Proxy)模式 讲解之后,本书提供了“专题:智能引用代理 ”以及“专题:虚拟代理的例子 ”两个独立章节专门讲解两个小系统设计中是如何使用代理模式的。

在观察者(Observer)模式讲解之后,本书提供了
专题:观察者模式与AWT中的事件处理
专题:观察者模式与SAX2浏览器
专题:观察者模式与Swing定时器
专题:MVC模式与用户输入数据检查
等专题章节,为读者提供了非常有使用价值的讲解和分析。

余下的就不一一列出了。您可以参考www.WebEndsHere.com所给出的本书的目录。我相信这就是您想要的。

应当指出的是,本书的很多例子来自笔者所参与过的真实的系统设计,虽然对问题的背景有一定的简化,但是都不是“玩具系统”,而是真实世界中所使用过的真正的实战设计,经过了笔者与其他高手的论战以及合作。

本书已经进入全国书店。

阎宏博士,写于纽约
《Java与模式》作者
电子信箱:javapatterns@yahoo.com
个人网站http://www.WebEndsHere.com
或者http://218.6.168.109/jeffyan77/

个人作品集http://www.yesky.com/20011108/203866.shtml

买书请到:
http://www.china-pub.com/computers/common/info.asp?id=8182
http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=BB07630282
http://www.cnforyou.com/query/bookdetail.asp?viBookCode=7638
Mai_520 2002-12-01
  • 打赏
  • 举报
回复
不错

50,713

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧