原型模式——创建型设计模式四
最后更新于:2022-04-01 09:30:01
## 一、原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
**用实例来说话:我要发简历,自己写了一份模板,然后复制了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);
……
}
~~~
## 二、类图
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c5ce70e6a6d.png)