Spiga

模式开发之旅(9):原型模式

2010-07-08 20:09:14

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。

如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。

//原型类
abstract class Prototype
{
    private string _id;

    public Prototype(string id)
    {
        _id = id;
    }
  
    public string Id
    {
        get { return _id; }
    }

    public abstract Prototype Clone();
}

//实现类
class ConcretePrototype : Prototype
{
    public ConcretePrototype(string id) : base(id)
    {

    }

    public override Prototype Clone()
    {
        return (Prototype)this.MemberwiseClone(); //浅拷贝
    }
}

原型模式有两种实现方法,深拷贝和浅拷贝。浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象……而深拷贝得到的是一份完完全全独立的对象。所以,深拷贝比起浅拷贝来说,更加耗时,更加耗内存空间。

如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了。一般情况下只有创建对象非常耗时,并且能控制共享数据带来的影响的情况下比较使用浅拷贝,否则,没有充分的理由,不要为了一点点的性能提升而使用浅拷贝。