一、原型模式
用原型執行個體指定建立對象的種類,并且通過拷貝這些原型建立新的對象。
用執行個體來說話:我要發履歷,自己寫了一份模闆,然後複制了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);
……
}
二、類圖