建立型模式之原型模式
阿新 • • 發佈:2020-08-13
目錄
定義與特點
原型(Prototype)模式的定義如下:用一個已經建立的例項作為原型,通過複製該原型物件來建立一個和原型相同或相似的新物件。
在這裡,原型例項指定了要建立的物件的種類。用這種方式建立物件非常高效,根本無須知道物件建立的細節。
例如,Windows 作業系統的安裝通常較耗時,如果複製就快了很多。在生活中複製的例子非常多,這裡不一一列舉了。
結構與實現
由於 C# 提供了 ICloneable 介面,用 C# 實現原型模式很簡單。
模式的結構
原型模式包含以下主要角色:
- 原型(Prototype)
- 具體原型類(ConcretePrototype):實現原型(抽象類或介面)的 Clone() 方法,它是可被複制的物件。
- 訪問類(Client):使用具體原型類中的 Clone() 方法來複制新的物件。
使用介面作為Prototype時,其結構圖如圖所示(後面全部是介面方式的原型模式實現):
使用抽象類作為Prototype時,其結構圖如圖所示(來自GOF):
模式的實現
C# 中已經定義了 ICloneable 介面,具體原型類只要實現 ICloneable
//原型介面:該介面不需要自己定義,C#中已經定義好了 public interface ICloneable { Object Clone(); } //抽象原型類 public abstract class Prototype { public abstract Object Clone(); } //具體原型類(介面方式) public class ConcretePrototype : /*Prototype,*/ICloneable { private int id; public int Id { get { return id; } } public ConcretePrototype(int id) { this.id = id; } public Object Clone() { return new ConcretePrototype(id); } //使用抽象原型類 //public override Object Clone() //{ // //Object的預設克隆方式(淺克隆) // return (Prototype)this.MemberwiseClone(); //} } //訪問類,這裡直接用的控制檯的Program類 class Program { static void Main(string[] args) { ConcretePrototype cp1 = new ConcretePrototype(1); ConcretePrototype cp2 = (ConcretePrototype)cp1.Clone(); Console.WriteLine("cp1的Id為:{0}",cp1.Id); Console.WriteLine("cp2的Id為:{0}", cp2.Id); Console.ReadKey(); } }
執行結果:
cp1的Id為:1
cp2的Id為:1
應用場景
原型模式通常適用於以下場景:
- 物件之間相同或相似,即只是個別的幾個屬性不同的時候。
- 物件的建立過程比較麻煩,但複製比較簡單的時候。
擴充套件:帶原型管理器的原型模式
原型模式可擴充套件為帶原型管理器的原型模式,它在原型模式的基礎上增加了一個原型管理器 PrototypeManager 類。該類用 Dictionary(或HashMap) 儲存多個複製的原型,Client 類可以通過管理器的 Get(String id) 方法從中獲取複製的原型。其結構如圖所示: