## 一、原型模式
用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
**用實例來說話:我要發簡歷,自己寫了一份模板,然后復制了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);
……
}
~~~
## 二、類圖

- 前言
- 抽象工廠——創建型設計模式一
- 工廠三姐妹——創建型設計模式之二
- 初識面向對象設計模式
- 建造者模式——創建型模式之三
- 原型模式——創建型設計模式四
- 適配器 and 組合模式——結構性模式之一
- 橋接模式——結構性設計模式之二
- 組合模式——結構型設計模式之三
- 裝飾模式——結構型設計模式之四
- 外觀模式——結構型設計模式之五
- 代理模式——結構型設計模式之六
- 觀察者模式——行為型設計模式之五
- 模板設計——行為設計模式之一
- 命令模式——行為設計模式之二
- 狀態模式——行為型設計模式之三
- 職責模式——行為設計模式之四
- 中介模式——行為模式之六
- 策略+簡單工廠 實戰篇
- 看觀察者怎么全方位觀察機房收費系統
- 登陸也需要裝飾——機房收費系統裝飾模式實戰
- 何為抽象?你有本末倒置嗎?
- 再回首,策略、簡單工廠是否依然?
- 再回首——行為型設計模式