欢迎来到天天文库
浏览记录
ID:11474111
大小:261.00 KB
页数:25页
时间:2018-07-12
《原型模式(prototype)与delphi对象克隆技术》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、原型模式(Prototype)与Delphi对象克隆技术概述:在这篇文件中,讲述原型模式定义、结构、应用、实现。深入讨论了Delphi中原型模式的实现方法。特别研究了原型模式的核心技术——对象克隆技术在Delphi中的实现途径。本文还探讨了对象引用复制和对象克隆的区别,以及VCL的持久对象机制、对象流化技术。1、原型模式解说原型模式通过给出一个原型对象来指明所要创建对象的类型,然后克隆该原型对象以便创建出更多同类型的新对象。例如:在Delphi的IDE中,我们为设计窗体拖放了一个按钮对象。为了快速创建更多的同样字体和尺寸的按钮对象,
2、我们可以复制该按钮(使用菜单Copy菜单或快捷键Ctrl+C),并在设计窗体多次粘贴(使用菜单Paste菜单或快捷键Ctrl+V。设计窗体中的按钮对象是用于我们应用程序的,而IDE中提供的按钮对象创建方法(复制和粘贴)则是属于Delphi架构的。我们通过复制创建一个按钮对象时,不需要知道Delphi是如何实现的。所要说明的是,虽然我们使用的是类似文字处理中的复制和粘贴,但复制的决不是一个按钮对象的外观(字体和尺寸等),而是整个按钮对象,包括它的属性和方法。所以,更严格讲,我们是克隆了这个对象,即得到一个和源对象一样的新对象。我们称这
3、种被克隆的对象(比如按钮)为原型。只要系统支持克隆功能,我们就可以任意克隆对象。由此可见,原型模式适用于系统应该与其对象的创建、组合及显示时无关的情况,包括:-当要实例化的类是在运行时刻指定时,例如,通过动态载入。-当类实例只是少数不同组合状态其中之一时,这时比较好的方式在适当的状态下使用一些组合的原型并复制他们,而不是人工的继承这些类。-避免建立工厂类等级结构平行产出类等级结构时。假设一个系统的产品类是动态加载的,而且产品类具有一定的等极结构。这个时候如果采取工厂模式的话,工厂类就不得不具有一个相应的等级。而产品类的等级结构一旦变
4、化,工厂类的等级结构就不得不有一个相应的变化。这对于产品结构可能会有经常性变化的系统来说,采用工厂模式就有不方便之处。这时如果采取原型模式,给每一个产品类配备一个克隆方法(大多数的时候只需给产品类等级结构的基类配备一个克隆方法),便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。这样,一个使用了原型模式的系统与它的产品对象是如何创建出来的,以及这些产品对象之间的结构是怎样的,还有这个结构会不会发生变化,都是没有关系的。2、Delphi对象的克隆原型模式通过克隆原型对象来创建新对象,因此了解和掌握Delphi中对象的克隆是使用原
5、型模式的关键。在Delphi创建一个对象实际上就是把一个类进行实例化。例如要从TMan类创建一个名为Tom的对象,可以这样创建:varTom:TMan;......Tom:=TMan.Create;以上语句完成了以下工作:-声明TMan类型的变量Tom;-为TMan类创建一个实例;-将变量Tom指向创建的实例。我们从中可以发现,对象变量和对象并不是一回事。对象是TMan类创建的一个实例,对象变量是该对象的引用。为了简单,在称呼上我们通常并不严格区分。但在使用时,务必分清对象引用和实际对象。有时在使用对象时无需使用对象变量来区分某一对
6、象,例如: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。所以这种方法只能复制对象的引用
7、而不能克隆整个对象。由此我们了解到,对象是类的动态实例,对象总是被动态分配到堆上。因此一个对象引用就如同一个句柄或一个指针。但你分配一个对象引用给一个变量时,Delphi仅复制引用,而不是整个对象。在Delphi中使用一个对象的唯一方法就是使用对象引用。一个对象引用通常以一个变量的形式存在,但是也有函数或者属性返回值的形式。Delphi中不像有的语言那样提供了对象克隆的功能(比如:Java有Object.clone方法),所以在Delphi中实现对象克隆的功能需要自己编写代码。好在VCL的体系结构中,TPersistent类系下的对
8、象可以通过覆盖Assign方法,实现克隆行为。TPersistent的Assign方法较常用于两个对象属性的复制。在Assign方法中可以完成对象属性、方法和事件的逐个复制。Assign方法在TPersistent类中声明为虚方法,以
此文档下载收益归作者所有