Prototype设计模式的实现

** Prototype ** ** 设计模式的实现 ** ** **

** Implementing the Prototype design Pattern **

下载本文代码

当我建立一个类的实例很复杂时,我们可以使用 Prototype 模式。与其建立很多类的实例,还不如进行适当的修改后,使用最初的实例的副本。使用 ** Prototype ** ** 模式 ** ,可以通过克隆一个原型,减少子类的数量。 Prototype 模式可以减少类的实例的数量。

在这个模式中,通过克隆来创建对象。我们有时创建很多的子类,除了通过很多的子类来创建不同的对象,我们还可以只需要唯一的一个子类,这个子类保持对每个对象基类的引用,并通过这个子类创建对象。通过向子类的构造函数传递参数并克隆对象。每个对象都实现 clone 方法,所以可以被克隆。我们可以使用 ** Prototype ** ** 模式,通过克隆 ** 原型 ** 来减少子类的数量。 ** ** **

** ** ** 克隆可以通过实现 ** Icloneable 接口来实现。 Icloneable 接口中唯一的方法是 Clone ,并返回一个新的类的实例。

** ICloneable.Clone method signature
** [VisualBasic] **_Function Clone() As Object
_ ** [C#] **_object Clone();

_ **

**_
_ ** 我们必须了解 Clone() 方法只是一种浅表复制( Shallow copy ),而不是深层复制( Deep copy )。所以它只是返回一个引用,而不象深层复制( Deep copy )那样创建一个复制的实例。我们可以通过使用 Iserializable 接口来实现深层复制( Deep copy )。

另一个缺点就是原型的每个子类必须实现 Clone() 方法,有时候,增加 clone 方法是很困难的。

在这个例子中,我建立了 EmpData 类,并且实现了 Icloneable 接口和 Iserializable 接口。 Icloneable 接口需要实现 Clone 方法,使得类可以被复制。 Iserializable 接口为了实现对 EmpData 类的深层复制( Deep copy )。使用的方法为:将 EmpData 对象序列化为一个文件,也可以将这个文件反序列化为一个 EmpData 对象。

EmpData 类包含两个方法: GetEmpData 和 ChangeEmpData 。这两个方法被用来以一个字符串( string )的形式获取 EmpData 对象、更改 EmpData 类。每个方法都可以被调用,来检验浅表复制( Shallow copy )和深层复制( Deep copy )的不同。浅表复制( Shallow copy )时,如果 EmpData 类改变时,这个变化也会同时出现在 EmpData 的克隆对象中;而在深层复制( Deep copy ),如果 EmpData 对象发生改变时,这个变化不会出现在 EmpData 的克隆对象中。

EmpData 类的构造函数读取 XML 文件并创建 Emp 对象。


实现见(二)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus