天天看点

原型模式——创建型设计模式四

一、原型模式

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

用实例来说话:我要发简历,自己写了一份模板,然后复制了N 份。如下:

//模板:class Resume

{

Private string name;

Public  Resume (string name)

{

This.name=name;

}

}

//客户端:

Static void Main(string[] args)

{

Resume a=new Resume("大鸟");

Resume b=new Resume("大鸟");

Resume b=new Resume("大鸟");

}

           

如果现在我想改,那就得把N份全改了,本来只是改动一点,却需要很长时间,没效率,真是费力不讨好的工作。

原型模式可以改变这种低级费力的工作。

原型模式其实就是从一个对象在创建灵位一个可定制的对象,而且不需知道任何创建的细节。在原型模式通过克隆Clone来实现对象之间的这种定制。

区别:以前的复制是每个对象都去实例化类,现在的克隆,是只实例化一个对象,然后通过这个对象传递给其他对象。

具体如下:

class Resume

{

Private string name;

Public  Resume (string name)

{

This.name=name;

}

//模板中增加克隆方法

Public object Clone()

{

Return (Object)this.MemberwiseClone();

}

}

 

 

Static void Main(string[] args)

{

Resume a=new Resume("大鸟");

Resume b=(Resume)a.clone();

Resume c=(Resume)a.clone();

}

           

Clone方法时将当前对象的非静态字段复制到该新对象,如果字段是值类型,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象。

有人有问了,那我要向实现将引用的对象也克隆过来怎么办?

上边的方法在模板中添加Clone 是一种浅复制,还有一种深复制,可以解决克隆引用对象的问题。

深复制

深复制需要增加三步:

1、让引用的类也继承系统的克隆类Icloneable,在类中添加克隆方法。

2、在调用类中,增加以被调用类为参数的私用构造函数,结果返回被调用类克隆方法,从而实现克隆。

3、在调用类的克隆方法中,调用私用构造方法,让引用克隆完成。

假如工作经历类为要调用的类:

1、让工作经历类继承接口

Class WorkExperience :Icloneable

{

//增加克隆方法

Public Object Clone()

{

Return (Object) this.MemberwiseClone();

}

}

           

2、在简历类中增加私有构造函数

Private Resume(WorkExperience work)

{

This.work=(WorkExperience)work.Clone();

}

           

3、修改简历类中的克隆方法。

public Object Clone()

{

Resume obj=new Resume(this.work);

 

……

}

 

           

二、类图

原型模式——创建型设计模式四

继续阅读