原型模式(Prototype Pattern)

1、 原型(Prototype)模式

經過給出一個原型對象來指明所要建立的對象類型,而後用複製這個原型對象的辦法建立出更多的同類型對象。Prototype模式容許一個對象再建立另一個可定製的對象,根本無需知道任何如何建立的細節。設計模式

2、原型模式的結構

 

3、原型模式的詳細介紹

在現實生活中,也有不少原型設計模式的例子,例如,細胞分裂的過程,一個細胞的有絲分裂產生兩個相同的細胞;還有西遊記中孫悟空變出後孫的本領和火影忍者中鳴人的隱分身忍術等。下面就以孫悟空爲例子來演示下原型模式的實現。具體的實現代碼以下:ide

///火影忍者中鳴人的影分身和孫悟空的的變都是原型模式
    class Client
    {
        static void Main(string[] args)
        {
            // 孫悟空 原型
            MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing");

            // 變一個
            MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ConcretePrototype;
            Console.WriteLine("Cloned1:\t"+cloneMonkeyKing.Id);

            // 變兩個
            MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() as ConcretePrototype;
            Console.WriteLine("Cloned2:\t" + cloneMonkeyKing2.Id);
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 孫悟空原型
    /// </summary>
    public  abstract class MonkeyKingPrototype
    {
        public string Id { get; set; }
        public MonkeyKingPrototype(string id)
        {
            this.Id = id;
        }

        // 克隆方法,即孫大聖說「變」
        public abstract MonkeyKingPrototype Clone();
    }

    /// <summary>
    /// 建立具體原型
    /// </summary>
    public class ConcretePrototype : MonkeyKingPrototype
    {
        public ConcretePrototype(string id)
            : base(id)
        { }

        /// <summary>
        /// 淺拷貝
        /// </summary>
        /// <returns></returns>
        public override MonkeyKingPrototype Clone()
        {
            // 調用MemberwiseClone方法實現的是淺拷貝,另外還有深拷貝
            return (MonkeyKingPrototype)this.MemberwiseClone();
        }
    }

上面原型模式的運行結果爲(從運行結果能夠看出,建立的兩個拷貝對象的ID屬性都是與原型對象ID屬性同樣的):工具

上面代碼實現的淺拷貝的方式,淺拷貝是指當對象的字段值被拷貝時,字段引用的對象不會被拷貝。例如,若是一個對象有一個指向字符串的字段,而且咱們對該對象作了一個淺拷貝,那麼這兩個對象將引用同一個字符串,而深拷貝是對對象實例中字段引用的對象也進行拷貝,若是一個對象有一個指向字符串的字段,而且咱們對該對象進行了深拷貝的話,那麼咱們將建立一個對象和一個新的字符串,新的對象將引用新的字符串。也就是說,執行深拷貝建立的新對象和原來對象不會共享任何東西,改變一個對象對另一個對象沒有任何影響,而執行淺拷貝建立的新對象與原來對象共享成員,改變一個對象,另一個對象的成員也會改變。this

介紹完原型模式的實現代碼以後,下面看下原型模式的類圖,經過類圖來理清原型模式實現中類之間的關係。具體類圖以下:spa

4、原型模式的優缺點

原型模式的優勢有:prototype

  1. 原型模式向客戶隱藏了建立新實例的複雜性
  2. 原型模式容許動態增長或較少產品類。
  3. 原型模式簡化了實例的建立結構,工廠方法模式須要有一個與產品類等級結構相同的等級結構,而原型模式不須要這樣。
  4. 產品類不須要事先肯定產品的等級結構,由於原型模式適用於任何的等級結構

原型模式的缺點有:設計

  1. 每一個類必須配備一個克隆方法
  2.  配備克隆方法須要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不必定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。

5、.NET中原型模式的實現

在.NET中能夠很容易地經過實現ICloneable接口(這個接口就是原型,提供克隆方法,至關於與上面代碼中MonkeyKingPrototype抽象類)中Clone()方法來實現原型模式,若是咱們想咱們自定義的類具備克隆的功能,首先定義類繼承與ICloneable接口並實現Clone方法。在.NET中實現了原型模式的類以下圖所示(圖中只截取了部分,能夠用Reflector反編譯工具進行查看):code

 

總結

到這裏關於原型模式的介紹就結束了,原型模式用一個原型對象來指明所要建立的對象類型,而後用複製這個原型對象的方法來建立出更多的同類型對象,它與工廠方法模式的實現很是類似,其中原型模式中的Clone方法就相似工廠方法模式中的工廠方法,只是工廠方法模式的工廠方法是經過new運算符從新建立一個新的對象(至關於原型模式的深拷貝實現),而原型模式是經過調用MemberwiseClone方法來對原來對象進行拷貝,也就是複製,同時在原型模式優勢中也介紹了與工廠方法的區別。對象

相關文章
相關標籤/搜索