ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 **用实例来说话:我要发简历,自己写了一份模板,然后复制了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://box.kancloud.cn/2016-02-18_56c5ce70e6a6d.png)