它是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式允许一个对象再创建另外一个可定制的对象,无需知道任何创建的细节。
工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。
eg:
当然上面这个关联关系有时候也可能是其他关系,具体情况需要变化
abstract class Prototype
{
private string id;
// Constructor
public Prototype(string id)
{
this.id = id;
}
// Property
public string Id
{
get { return id; }
}
public abstract Prototype Clone(); //主要是这个函数
}
class ConcretePrototype1 : Prototype
{
// Constructor
public ConcretePrototype1(string id) : base(id)
{
}
public override Prototype Clone()
{
// Shallow copy
return (Prototype) new ConcretePrototype1(this.Id);
}
}
static void Main(string[] args)
{
Prototype p1, c1;
p1 = new ConcretePrototype1(“Design Pattern");
c1 = p1.Clone();
Console.WriteLine("Cloned: {0}", c1.Id);
Console.Read();
}
模式解析:
对于.Net而言,原型抽象类Prototype是用不着的,因为克隆实在太常用了,所以.Net在System命名空间中提供了Icloneable接口,其中就是一个唯一的方法Clone(),这样,只用实现这个接口就可以完成原型模式了
另一方面,所有的Java类都继承自java.lang.Object,而Object类提供一个clone()方法,可以将一个Java对象复制一份。但是,这个Java类必须实现一个标识接口Cloneable,标识这个Java类支持复制。
然后注意深克隆与浅克隆的关系:
深克隆与浅克隆
在浅克隆中,被复制对象的所有变量都具有与原来的对象相同的值,而所有对其它对象的引用仍然指向原来的对象。换言之,浅克隆仅仅复制所考虑的对象,而不复制它所引用的对象,也就是说其中的成员对象并不复制。在浅克隆中,当对象被复制时它所包含的成员对象却没有被复制。
在深克隆中,对象在复制的同时其成员对象也将复制。(当对象里面还含有其他对象时,自己重新写clone函数的时候就要注意,要把对象复制手写一遍,系统并不能完成这个功能)