国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

原型(Prototype)模式

2024-07-21 02:04:04
字體:
供稿:網(wǎng)友

一、 原型(Prototype)模式

原型模式的用意是:通過給出一個原型對象來指明所要創(chuàng)建的對象類型,然后用復制這個原型對象的辦法創(chuàng)建出更多的同類型對象。

從孫大圣的手段談起

孫悟空在與黃風怪的戰(zhàn)斗中,"使一個身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一噴,叫聲'變',變有百十個行者,都是一樣得打扮,各執(zhí)一根鐵棒,把那怪圍在空中。"換而言之,孫悟空可以根據(jù)自己的形象,復制出很多"身外身"來。

老孫這種身外身的手段在面向?qū)ο笤O(shè)計領(lǐng)域里叫原型(Prototype)模式。

C#對原型模式的支持

在C#里面,我們可以很容易的通過Clone()方法實現(xiàn)原型模式。任何類,只要想支持克隆,必須實現(xiàn)C#中的ICloneable接口。ICloneable接口中有一Clone方法,可以在類中復寫實現(xiàn)自定義的克隆方法。克隆的實現(xiàn)方法有兩種:淺拷貝(shallow copy)與深拷貝(deep copy)。

(以下摘自:《.NET框架程序設(shè)計(修訂版)》,李建忠譯)淺拷貝是指當對象的字段值被拷貝時,字段引用的對象不會被拷貝。例如,如果一個對象有一個指向字符串的字段,并且我們對該對象做了一個淺拷貝,那么兩個對象將引用同一個字符串。而深拷貝是對對象實例中字段引用的對象也進行拷貝的一種方式,所以如果一個對象有一個指向字符串的字段,并且我們對該對象做了一個深拷貝的話,我們將創(chuàng)建一個新的對象和一個新的字符串--新對象將引用新字符串。需要注意的是執(zhí)行深拷貝后,原來的對象和新創(chuàng)建的對象不會共享任何東西;改變一個對象對另外一個對象沒有任何影響。


二、 Prototype模式的結(jié)構(gòu):

 

客戶(Client)角色:客戶類提出創(chuàng)建對象的請求。
抽象原型(Prototype)角色:這是一個抽象角色,通常由一個C#接口或抽象類實現(xiàn)。此角色給出所有的具體原型類所需的接口。在C#中,抽象原型角色通常實現(xiàn)了ICloneable接口。
具體原型(Concrete Prototype)角色:被復制的對象。此角色需要實現(xiàn)抽象原型角色所要求的接口。

using System;

namespace DoFactory.GangOfFour.Prototype.Structural
{
 
  // MainApp test application

  class MainApp
  {
   
    static void Main()
    {
      // Create two instances and clone each

      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();
    }
  }

  // "Prototype"

  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();
  }

  // "ConcretePrototype1"

  class ConcretePrototype1 : Prototype
  {
    // Constructor
    public ConcretePrototype1(string id) : base(id)
    {
    }

    public override Prototype Clone()
    {
      // Shallow copy
      return (Prototype)this.MemberwiseClone();
    }
  }

  // "ConcretePrototype2"

  class ConcretePrototype2 : Prototype
  {
    // Constructor
    public ConcretePrototype2(string id) : base(id)
    {
    }

    public override Prototype Clone()
    {
      // Shallow copy
      return (Prototype)this.MemberwiseClone();
    }
  }
}
四、 帶Prototype Manager的原型模式

原型模式的第二種形式是帶原型管理器的原型模式,其UML圖如下:

 

客戶(Client)角色:客戶端類向原型管理器提出創(chuàng)建對象的請求。
抽象原型(Prototype)角色:這是一個抽象角色,通常由一個C#接口或抽象類實現(xiàn)。此角色給出所有的具體原型類所需的接口。在C#中,抽象原型角色通常實現(xiàn)了ICloneable接口。
具體原型(Concrete Prototype)角色:被復制的對象。此角色需要實現(xiàn)抽象的原型角色所要求的接口。
原型管理器(Prototype Manager)角色:創(chuàng)建具體原型類的對象,并記錄每一個被創(chuàng)建的對象。


下面這個例子演示了在原型管理器中存儲用戶預先定義的顏色原型,客戶通過原型管理器克隆顏色對象。

六、 Prototype模式的優(yōu)點與缺點

Prototype模式的優(yōu)點包括

1、Prototype模式允許動態(tài)增加或減少產(chǎn)品類。由于創(chuàng)建產(chǎn)品類實例的方法是產(chǎn)批類內(nèi)部具有的,因此增加新產(chǎn)品對整個結(jié)構(gòu)沒有影響。

2、Prototype模式提供了簡化的創(chuàng)建結(jié)構(gòu)。工廠方法模式常常需要有一個與產(chǎn)品類等級結(jié)構(gòu)相同的等級結(jié)構(gòu),而Prototype模式就不需要這樣。

3、Portotype模式具有給一個應(yīng)用軟件動態(tài)加載新功能的能力。由于Prototype的獨立性較高,可以很容易動態(tài)加載新功能而不影響老系統(tǒng)。

4、產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),因為Prototype模式適用于任何的等級結(jié)構(gòu)。


Prototype模式的缺點:

Prototype模式的最主要缺點就是每一個類必須配備一個克隆方法。而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 塔河县| 达拉特旗| 和龙市| 静乐县| 庄河市| 滁州市| 尤溪县| 桃源县| 无为县| 安义县| 安龙县| 忻州市| 西和县| 铁岭县| 阿城市| 宝兴县| 布尔津县| 宾川县| 竹北市| 宿松县| 将乐县| 昭苏县| 涪陵区| 夏津县| 孙吴县| 根河市| 剑河县| 灵寿县| 柳江县| 泰州市| 镇康县| 平山县| 莲花县| 松溪县| 武夷山市| 耒阳市| 芜湖县| 宁南县| 紫云| 潜江市| 双鸭山市|