天天看點

原型模式——建立型設計模式四

一、原型模式

用原型執行個體指定建立對象的種類,并且通過拷貝這些原型建立新的對象。

用執行個體來說話:我要發履歷,自己寫了一份模闆,然後複制了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);

 

……

}

 

           

二、類圖

原型模式——建立型設計模式四

繼續閱讀