1. 程式人生 > 實用技巧 >建立型模式之原型模式

建立型模式之原型模式

目錄

定義與特點

原型(Prototype)模式的定義如下:用一個已經建立的例項作為原型,通過複製該原型物件來建立一個和原型相同或相似的新物件。
在這裡,原型例項指定了要建立的物件的種類。用這種方式建立物件非常高效,根本無須知道物件建立的細節。
例如,Windows 作業系統的安裝通常較耗時,如果複製就快了很多。在生活中複製的例子非常多,這裡不一一列舉了。

結構與實現

由於 C# 提供了 ICloneable 介面,用 C# 實現原型模式很簡單。

模式的結構

原型模式包含以下主要角色:

  • 原型(Prototype)
    :宣告一個克隆自身的介面,該角色一般有抽象類(Prototype)、介面(ICloneable)兩種實現方式(GOF使用的是抽象類,在C#中個人推薦使用介面)。
  • 具體原型類(ConcretePrototype):實現原型(抽象類或介面)的 Clone() 方法,它是可被複制的物件。
  • 訪問類(Client):使用具體原型類中的 Clone() 方法來複制新的物件。

使用介面作為Prototype時,其結構圖如圖所示(後面全部是介面方式的原型模式實現):

使用抽象類作為Prototype時,其結構圖如圖所示(來自GOF):

模式的實現

C# 中已經定義了 ICloneable 介面,具體原型類只要實現 ICloneable

介面就可實現物件的克隆(Object有 MemberwiseClone() 方法預設淺克隆),克隆是淺克隆還是深克隆取決於具體原型類 Clone() 的實現。其程式碼如下:

//原型介面:該介面不需要自己定義,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) 方法從中獲取複製的原型。其結構如圖所示: