原型模式与Delphi对象克隆技术.docx

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

原型模式(Prototype)与Delphi对象克隆技术

概述:

在这篇文件中,讲述原型模式定义、结构、应用、实现。深入讨论了Delphi中原型模式的实现方法。特别研究了原型模式的核心技术——对象克隆技术在Delphi中的实现途径。本文还探讨了对象引用复制和对象克隆的区别,以及VCL的持久对象机制、对象流化技术。

1、原型模式解说

原型模式通过给出一个原型对象来指明所要创建对象的类型,然后克隆该原型对象以便创建出更多同类型的新对象。例如:在Delphi的IDE中,我们为设计窗体拖放了一个按钮对象。为了快速创建更多的同样字体和尺寸的按钮对象,我们可以复制该按钮(使用菜单Copy菜单或快捷键Ctrl+C),并在设计窗体多次粘贴(使用菜单Paste菜单或快捷键Ctrl+V。

设计窗体中的按钮对象是用于我们应用程序的,而IDE中提供的按钮对象创建方法(复制和粘贴)则是属于Delphi

架构的。我们通过复制创建一个按钮对象时,不需要知道Delphi是如何实现的。

所要说明的是,虽然我们使用的是类似文字处理中的复制和粘贴,但复制的决不是一个按钮对象的外观(字体和尺寸等),而是整个按钮对象,包括它的属性和方法。所以,更严格讲,我们是克隆了这个对象,即得到一个和源对象一样的新对象。我们称这种被克隆的对象(比如按钮)为原型。只要系统支持克隆功能,我们就可以任意克隆对象。由此可见,原型模式适用于系统应该与其对象的创建、组合及显示时无关的情况,包括:

-当要实例化的类是在运行时刻指定时,例如,通过动态载入。

-当类实例只是少数不同组合状态其中之一时,这时比较好的方式在适当的状态下使用一些组合的原型并复制他们,而不是人工的继承这些类。

-避免建立工厂类等级结构平行产出类等级结构时。

假设一个系统的产品类是动态加载的,而且产品类具有一定的等极结构。这个时候如果采取工厂模式的话,工厂类就不得不具有一个相应的等级。而产品类的等级结构一旦变化,工厂类的等级结构就不得不有一个相应的变化。这对于产品结构可能会有经常性变化的系统来说,采用工厂模式就有不方便之处。

这时如果采取原型模式,给每一个产品类配备一个克隆方法(大多数的时候只需给产品类等级结构的基类配备一个克隆方法),便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。

这样,一个使用了原型模式的系统与它的产品对象是如何创建出来的,以及这些产品对象之间的结构是怎样的,还有这个结构会不会发生变化,都是没有关系的。

2、Delphi对象的克隆

原型模式通过克隆原型对象来创建新对象,因此了解和掌握Delphi中对象的克隆是使用原型模式的关键。

在Delphi创建一个对象实际上就是把一个类进行实例化。例如要从TMan类创建一个名为Tom的对象,可以这样创建:

varTom:TMan;

......

Tom:=TMan.Create;

以上语句完成了以下工作:

-声明TMan类型的变量Tom;

-为TMan类创建一个实例;

-将变量Tom指向创建的实例。

我们从中可以发现,对象变量和对象并不是一回事。对象是TMan类创建的一个实例,对象变量是该对象的引用。为了简单,在称呼上我们通常并不严格区分。但在使用时,务必分清对象引用和实际对象。

有时在使用对象时无需使用对象变量来区分某一对象,例如:

Factory.MakeTool(TMan.Create);

这里无需区分TMan的实例是Tom还是Jack。

但我们使用以下例子时,表示Tom和Jack分别引用了不同的TMan的实例,此时他们是两个对象。

varTom,Jack:TMan;

......

Tom:=TMan.Create;

Jack:=TMan.Create;

但是如果接着使用以下语句:

Tom:=Jack;

此时Tom变量就不再引用Tom对象,而是引用Jack对象,这就好像Tom变成了Jack的另一个名字。当你找Tom时,找到的是Jack。所以这种方法只能复制对象的引用而不能克隆整个对象。

由此我们了解到,对象是类的动态实例,对象总是被动态分配到堆上。因此一个对象引用就如同一个句柄或一个指针。但你分配一个对象引用给一个变量时,Delphi仅复制引用,而不是整个对象。在Delphi中使用一个对象的唯一方法就是使用对象引用。一个对象引用通常以一个变量的形式存在,但是也有函数或者属性返回值的形式。

Delphi中不像有的语言那样提供了对象克隆的功能(比如:Java有Object.clone方法),所以在Delphi中实现对象克隆的功能需要自己编写代码。

好在VCL的体系结构中,TPersiste

文档评论(0)

dqy118 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海海滋实业有限公司
IP属地上海
统一社会信用代码/组织机构代码
91310115MA7DL1JF2N

1亿VIP精品文档

相关文档