日期:2014-05-17 浏览次数:21060 次
原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
《西游记》中,孙悟空可以根据自己的形状复制(克隆)出多个身外身,如图1所示,这种技巧在面向对象软件设计领域被称之为原型模式,孙悟空被称之为原型对象。原型模式通过复制一个原型对象得到多个与原型对象一模一样的新对象。
图1 孙悟空复制身外身
原型模式结构如图2所示:
图2 原型模式结构图
实现原型模式的关键在于如何实现克隆方法,不同的编程语言提供了不同的克隆方法实现机制,下面介绍两种在C#语言中常用的克隆实现方法。
1. 通用实现方法
通用的克隆实现方法是在具体原型类的克隆方法中实例化一个与自身类型相同的对象并将其返回,并将相关的参数传入新创建的对象中,保证它们的成员变量相同。示意代码如下:
abstract class Prototype { public abstract Prototype Clone(); } class ConcretePrototype : Prototype { private string attr; //成员变量 public string Attr { get { return attr; } set { attr = value; } } //克隆方法 public override Prototype Clone() { ConcretePrototype prototype = new ConcretePrototype(); prototype.Attr = attr; return prototype; } }
在客户类中只需要创建一个ConcretePrototype对象作为原型对象,然后调用其Clone()方法即可得到对应的克隆对象,如下代码片段所示:
…… ConcretePrototype prototype = new ConcretePrototype(); ConcretePrototype copy = (ConcretePrototype)prototype.Clone(); ……
此方法是原型模式的通用实现,它与编程语言本身的特性无关,除C#外,其他面向对象编程语言也可以使用这种形式来实现对原型的克隆。
在原型模式的通用实现方法中,可通过手工编写Clone()方法来实现浅克隆和深克隆。对于引用类型的对象,可以在Clone()方法中通过赋值的方式来实现复制,这是一种浅克隆实现方案;如果在Clone()方法中通过创建一个全新的成员对象来实现复制,则是一种深克隆实现方案。C#语言中的字符串(string/String)对象存在特殊性,只要两个字符串的内容相同,无论是直接赋值还是创建新对象,它们在内存中始终只有一份。如需进一步了解,大家可查阅“C#字符串驻留机制”相关资料。
2. C#中的MemberwiseClone()方法和