1. 程式人生 > >【設計模式】——原型模式

【設計模式】——原型模式

【原型模式】

原型模式是用原型例項制定建立物件的種類,並且通過拷貝這些原型建立新的物件

這種模式是實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。

 

【介紹】

  • 主要解決:在執行期建立和刪除原型

  • 何時使用:1、當一個系統應該獨立於它的產品建立,構成和表示時;2、當要例項化的類是在執行時刻指定時,例如,通過動態裝載;3、為了避免建立一個於產品類層次平行的工廠類層次時;4、當一個類的例項只有被幾個不同狀態組合中的一種時,建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些

  • 如何解決:利用已有的一個原型物件,快速地生成和原型物件一樣的例項

  • 優點:效能高、逃避建構函式的約束

  • 缺點:1、配備克隆方法需要對類的功能進行通盤考慮,對於全新類不是很難,但是對於已有的類不一定容易;2、必須實現Cloneable介面

  • 注意事項:與通過一個類進行例項化來構造新物件不同的是,原型模式是通過拷貝一個現有物件的生成一個新的物件。淺拷貝實現cloneable,深拷貝是通過實現serializable讀取二進位制流。

 

【實現】

 

步驟一:原型類


 

abstract class Prototype

    {

        private string id;



        // Constructor

        public Prototype(string id)

        {

            this.id = id;

        }



        // Property

        public string Id

        {

            get { return id; }

        }



        public abstract Prototype Clone();

    }

步驟二:具體原型類

class ConcretePrototype1 : Prototype

    {

        // Constructor

        public ConcretePrototype1(string id)

            : base(id)

        {

        }



        public override Prototype Clone()

        {

            // Shallow copy

            return (Prototype)this.MemberwiseClone();

        }

    }





    class ConcretePrototype2 : Prototype

    {

        // Constructor

        public ConcretePrototype2(string id)

            : base(id)

        {

        }



        public override Prototype Clone()

        {

            // Shallow copy

            return (Prototype)this.MemberwiseClone();

        }

    }

 

步驟三:客戶端程式碼


 

ConcretePrototype1 p1 = new ConcretePrototype1("I");

            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();

            Console.WriteLine("Cloned: {0}", c1.Id);



            ConcretePrototype2 p2 = new ConcretePrototype2("II");

            ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();

            Console.WriteLine("Cloned: {0}", c2.Id);



            // Wait for user

            Console.Read();

【總結】

 

MemberwiseClone()方法:如果欄位是值型別,則該欄位執行逐位複製,如果欄位是引用型別,則複製引用但不復制引用型別,因此,原始物件及其複本引用同一物件。

 

淺複製:被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。

深複製:深複製把引用物件的變數指向複製過的新物件,而不是原來的被引用的物件