使用 MemberwiseClone() 實現淺拷貝,僅複製值類型欄位與參考類型的參考位址:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Prototype
{
///
/// 淺拷貝
///
public class ShallowCopy : ICloneable
{
///
/// 建構函式
///
public ShallowCopy()
{
}
///
/// 實作 ICloneable 的 Clone() 方法
///
/// 淺拷貝後的物件
public Object Clone()
{
return this.MemberwiseClone();
}
private MessageModel _mm;
///
/// Message 實體物件
///
public MessageModel MessageModel
{
get { return _mm; }
set { _mm = value; }
}
}
}
在 Clone() 中手動建立新的 MessageModel 實例,確保參考類型欄位也被完整複製:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Prototype
{
///
/// 深拷貝
///
public class DeepCopy : ICloneable
{
///
/// 建構函式
///
public DeepCopy()
{
}
///
/// 帶參數建構函式(供 Clone 內部使用)
///
/// Message 實體物件
public DeepCopy(MessageModel mm)
{
_mm = mm;
}
///
/// 實作 ICloneable 的 Clone() 方法
///
/// 深拷貝後的物件
public Object Clone()
{
return new DeepCopy(new MessageModel(_mm.Message, _mm.PublishTime));
}
private MessageModel _mm;
///
/// Message 實體物件
///
public MessageModel MessageModel
{
get { return _mm; }
set { _mm = value; }
}
}
}
// 淺拷貝:一行搞定,但參考共用
public Object Clone() { return this.MemberwiseClone(); }
// 深拷貝:手動 new 新實例,參考獨立
public Object Clone() {
return new DeepCopy(new MessageModel(_mm.Message, _mm.PublishTime));
}
ICloneable,提供統一的複製協定。DeepCopy 提供帶參數建構函式供 Clone() 內部使用。MessageModel 的所有欄位(Message、PublishTime)都被複製。MessageModel 內部還有參考類型欄位,需繼續遞歸複製。選擇淺拷貝還是深拷貝取決於業務需求:若物件圖簡單且允許共用參考物件,淺拷貝效能較好;若需要完全獨立的物件副本,必須實作深拷貝。