## 引言 **原型模式**是一種創建型設計模式,它允許我們創建一個對象的副本,而不需要顯式地使用構造函數來創建一個新的對象。這種模式通常用於創建那些具有複雜創建過程或需要大量資源的對象。 在原型模式中,我們首先定義一個原型介面,該介面包含一個克隆方法。然後我們創建一個原型對象,該對象實現了原型介面 ...
引言
原型模式是一種創建型設計模式,它允許我們創建一個對象的副本,而不需要顯式地使用構造函數來創建一個新的對象。這種模式通常用於創建那些具有複雜創建過程或需要大量資源的對象。
在原型模式中,我們首先定義一個原型介面,該介面包含一個克隆方法。然後我們創建一個原型對象,該對象實現了原型介面並提供了自己的克隆方法。最後,我們可以使用原型對象的克隆方法來創建新的對象,而無需重新實例化原型對象。
IClone介面
需要定義一個IClone
介面。這個類中應該包含一個 Clone
方法,用於克隆自身。
public interface IClone<T> where T : class
{
public T Clone();
}
原型類
定義一個具體原型類,它實現IClone
介面,並實現了Clone
方法
public class ConcretePrototype : IClone<ConcretePrototype>
{
private string _name;
public ConcretePrototype(string name)
{
_name = name;
}
public ConcretePrototype Clone()
{
return (ConcretePrototype)this.MemberwiseClone();
}
public void SetName(string name)
{
_name = name;
}
public void PrintName()
{
Console.WriteLine($"Name: {_name}");
}
}
在具體原型類中,我們實現了 Clone
方法,並使用了 MemberwiseClone
方法來複制對象。此外,我們還添加了一個 SetName
方法和一個 PrintName
方法,用於演示對象的複製和修改。
:::tip{title="提示"}
- 使用
Clone
方法來複制對象。需要註意的是,在複製對象時,我們需要使用MemberwiseClone
方法或其他深拷貝方法來複制對象本身,而不是複製它的引用。此外,如果需要複製對象的引用類型成員,我們需要在具體原型類中對它們進行深拷貝。 - 原型模式是在記憶體二進位流的拷貝,要比直接
new
一個對象性能好很多,特別是要在一個迴圈體內產生大量的對象時,原型模式可以更好地體現其優點。 - 執行
Clone
方法複製對象時,不執行其構造函數。
:::
接下來,我們可以使用具體原型類來創建新的對象。具體地說,我們可以先創建一個原型對象,然後調用它的 Clone 方法來複制它,並修改複製出的對象的狀態。
ConcretePrototype prototype = new ConcretePrototype("prototype");
ConcretePrototype clone = (ConcretePrototype)prototype.Clone();
prototype.PrintName(); // Name: prototype
clone.PrintName(); // Name: prototype
clone.SetName("clone");
prototype.PrintName(); // Name: prototype
clone.PrintName(); // Name: clone
在這段代碼中,我們首先創建了一個名為 prototype
的具體原型對象,並輸出它的名字。然後,我們調用了 prototype
的 Clone
方法來複制它,並將結果保存在名為 clone
的變數中。接著,我們修改了 clone
的名字為 "clone",並分別輸出 prototype
和 clone
的名字,以證明它們是不同的對象。
總結
原型模式適用於以下情況:
- 當需要創建的對象的類型由程式在運行時確定時,原型模式比工廠模式更加靈活。
- 當需要創建的對象的創建過程較為複雜,或者需要初始化較長時間時,原型模式可以避免重覆創建對象的開銷。
- 當需要創建的對象與其它對象具有相似的屬性和方法時,原型模式可以避免重覆編寫相同的代碼。
作者: Peter.Pan
出處: https://www.cnblogs.com/pandefu/>
關於作者:.Net Framework,.Net Core ,WindowsForm,WPF ,控制項庫,多線程
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接,否則保留追究法律責任的權利。 如有問題, 可郵件咨詢。