以下程式碼展示如何使用原型模式進行淺拷貝與深拷貝,並驗證兩者在修改原始物件時的行為差異:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Pattern.Prototype;
public partial class Prototype : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("ShallowCopy演示如下:<br />");
ShowShallowCopy();
Response.Write("DeepCopy演示如下:<br />");
ShowDeepCopy();
}
private void ShowShallowCopy()
{
ShallowCopy sc = new ShallowCopy();
sc.MessageModel = new MessageModel("ShallowCopy", DateTime.Now);
ShallowCopy sc2 = (ShallowCopy)sc.Clone();
Response.Write(sc.MessageModel.Message);
Response.Write("<br />");
Response.Write(sc2.MessageModel.Message);
Response.Write("<br />");
sc.MessageModel.Message = "ShallowCopyShallowCopy";
Response.Write(sc.MessageModel.Message);
Response.Write("<br />");
Response.Write(sc2.MessageModel.Message);
Response.Write("<br />");
}
private void ShowDeepCopy()
{
DeepCopy sc = new DeepCopy();
sc.MessageModel = new MessageModel("DeepCopy", DateTime.Now);
DeepCopy sc2 = (DeepCopy)sc.Clone();
Response.Write(sc.MessageModel.Message);
Response.Write("<br />");
Response.Write(sc2.MessageModel.Message);
Response.Write("<br />");
sc.MessageModel.Message = "DeepCopyDeepCopy";
Response.Write(sc.MessageModel.Message);
Response.Write("<br />");
Response.Write(sc2.MessageModel.Message);
Response.Write("<br />");
}
}
ShallowCopy
ShallowCopy
ShallowCopyShallowCopy
ShallowCopyShallowCopy
分析:修改原始物件的 MessageModel.Message 後,拷貝物件的對應屬性也跟著改變,因為兩者共用同一個 MessageModel 參考。
DeepCopy
DeepCopy
DeepCopyDeepCopy
DeepCopy
分析:修改原始物件的 MessageModel.Message 後,拷貝物件保持原值,因為深拷貝在 Clone() 中建立了新的 MessageModel 實例。
| 特性 | 淺拷貝 (MemberwiseClone) | 深拷貝 (new 實例) |
|---|---|---|
| 值類型欄位 | 複製數值 | 複製數值 |
| 參考類型欄位 | 複製參考(共用物件) | 建立新物件並複製內容 |
| 修改原物件影響 | 影響拷貝物件 | 不影響拷貝物件 |
| 效能 | 較快 | 較慢(需遞歸複製) |
| 適用場景 | 物件圖簡單、無巢狀參考 | 物件圖複雜、需完全獨立副本 |