超碰免费人人操|国产视频二区久久艹人人操|欧美激情第一页在线|久热最新无码中文视频|91精品国际成人|亚洲成人精品在线视频青青草|久草免费高清完整在线观看|你懂的AV在线日本黄网页|国产黄色AV日韩女同网|欧美成人色区导航片av

C語(yǔ)言編程中使用設(shè)計(jì)模式中的原型模式的講解

時(shí)間:2025-10-23 20:08:59 C語(yǔ)言

C語(yǔ)言編程中使用設(shè)計(jì)模式中的原型模式的講解

  一、引言

  在軟件系統(tǒng)中,當(dāng)創(chuàng)建一個(gè)類(lèi)的實(shí)例的過(guò)程很昂貴或很復(fù)雜,并且我們需要?jiǎng)?chuàng)建多個(gè)這樣類(lèi)的實(shí)例時(shí),如果我們用new操作符去創(chuàng)建這樣的類(lèi)實(shí)例,這未免會(huì)增加創(chuàng)建類(lèi)的復(fù)雜度和耗費(fèi)更多的內(nèi)存空間,因?yàn)檫@樣在內(nèi)存中分配了多個(gè)一樣的類(lèi)實(shí)例對(duì)象,然后如果采用工廠模式來(lái)創(chuàng)建這樣的系統(tǒng)的話,隨著產(chǎn)品類(lèi)的不斷增加,導(dǎo)致子類(lèi)的數(shù)量不斷增多,反而增加了系統(tǒng)復(fù)雜程度,所以在這里使用工廠模式來(lái)封裝類(lèi)創(chuàng)建過(guò)程并不合適,然而原型模式可以很好地解決這個(gè)問(wèn)題,因?yàn)槊總(gè)類(lèi)實(shí)例都是相同的,當(dāng)我們需要多個(gè)相同的類(lèi)實(shí)例時(shí),沒(méi)必要每次都使用new運(yùn)算符去創(chuàng)建相同的類(lèi)實(shí)例對(duì)象,此時(shí)我們一般思路就是想——只創(chuàng)建一個(gè)類(lèi)實(shí)例對(duì)象,如果后面需要更多這樣的實(shí)例,可以通過(guò)對(duì)原來(lái)對(duì)象拷貝一份來(lái)完成創(chuàng)建,這樣在內(nèi)存中不需要?jiǎng)?chuàng)建多個(gè)相同的類(lèi)實(shí)例,從而減少內(nèi)存的消耗和達(dá)到類(lèi)實(shí)例的復(fù)用。 然而這個(gè)思路正是原型模式的實(shí)現(xiàn)方式。下面就具體介紹下設(shè)計(jì)模式中的原型設(shè)計(jì)模式。

  二、原型模式的詳細(xì)介紹

  我們來(lái)看一個(gè)入學(xué)考試場(chǎng)景實(shí)例

  基對(duì)象(一般為接口,抽象類(lèi)):考試題(樣卷)

  原型模式的復(fù)職克。焊鶕(jù)需要印刷考卷,這里的考卷都是復(fù)制考試題樣卷

  客戶(hù)端:學(xué)生答卷,同一套試卷,學(xué)生做題不可能一模一樣

  類(lèi)圖:

  接口:試卷樣例代碼

  /pic/

  /pic/ 選答題  /pic/

  public class SelectTest  {    private string other;    public string 你老婆多大    {      get      {        return this.other;      }      set      {        this.other = value;      }    }  }  /pic/

  /pic/ 面試題  /pic/

  public interface Itest  {    Itest Clone();    string 知道設(shè)計(jì)模式嗎    {      get;      set;    }    string 設(shè)計(jì)模式有幾種    {      get;      set;    }    string 你知道那些    {      get;      set;    }    SelectTest 附加題    {      get;      set;    }    Test Test    {      get;      set;    }    Test Test1    {      get;      set;    }  }

  復(fù)制克。簭(fù)印機(jī)

  /pic/

  /pic/ 繼承Itest接口  /pic/

  public class Test : Itest  {    private string one;    private string two;    private string three;    private SelectTest other=new SelectTest();    public string 知道設(shè)計(jì)模式嗎    {      get      {        return this.one;      }      set      {        this.one = value;      }    }    public string 設(shè)計(jì)模式有幾種    {      get      {        return this.two;      }      set      {        this.two = value;      }    }    public string 你知道那些    {      get      {        return this.three;      }      set      {        this.three = value;      }    }    public SelectTest 附加題    {      get      {        return this.other;      }      set      {        this.other = value;      }    }    #region IColorDemo 成員    public Itest Clone()    {      /pic/p>

  客戶(hù)端,發(fā)卷做題

  static void Main()    {      /pic/pic/pic/pic/pic/pic/pic/pic/pic/p>

  注意:這里兩個(gè)人答得不一樣,為什么附加題中,老婆年齡都為20?

  這里涉及到深拷貝,淺拷貝問(wèn)題,值類(lèi)型是放在棧上的,拷貝之后,會(huì)自會(huì)在站上重新add一個(gè),而class屬于引用類(lèi)型,拷貝之后,棧上重新分配啦一個(gè)指針,可指針卻指向同一個(gè)位置的資源。淺拷貝,只拷貝值類(lèi)型,深拷貝,引用類(lèi)型也拷貝復(fù)制。

  解決方案:

  public Itest Clone()    {      /pic/p>

  使用序列化解決

  /pic/

  /pic/ 選答題  /pic/

  [Serializable]   public class SelectTest  {    private string other;    public string 你老婆多大    {      get      {        return this.other;      }      set      {        this.other = value;      }    }  }  /pic/

  /pic/ 面試題  /pic/

  public interface Itest  {    Itest Clone();    string 知道設(shè)計(jì)模式嗎    {      get;      set;    }    string 設(shè)計(jì)模式有幾種    {      get;      set;    }    string 你知道那些    {      get;      set;    }    SelectTest 附加題    {      get;      set;    }     }  /pic/

  /pic/ 繼承Itest接口  /pic/

  public class Test : Itest  {    private string one;    private string two;    private string three;    private SelectTest other=new SelectTest();    public string 知道設(shè)計(jì)模式嗎    {      get      {        return this.one;      }      set      {        this.one = value;      }    }    public string 設(shè)計(jì)模式有幾種    {      get      {        return this.two;      }      set      {        this.two = value;      }    }    public string 你知道那些    {      get      {        return this.three;      }      set      {        this.three = value;      }    }    public SelectTest 附加題    {      get      {        return this.other;      }      set      {        this.other = value;      }    }        public Itest Clone()    {      SerializableHelper SerializableHelper = new 原型模式.SerializableHelper();      string target = SerializableHelper.Serializable(this);      return SerializableHelper.Derializable

  (target);     }  } public class SerializableHelper  {    public string Serializable(object target)    {      using (MemoryStream stream = new MemoryStream())      {        new BinaryFormatter().Serialize(stream, target);        return Convert.ToBase64String(stream.ToArray());      }    }    public object Derializable(string target)    {      byte[] targetArray = Convert.FromBase64String(target);      using (MemoryStream stream = new MemoryStream(targetArray))      {        return new BinaryFormatter().Deserialize(stream);      }    }    public T Derializable(string target)    {      return (T)Derializable(target);    }  }

  這就是對(duì)原型模式的運(yùn)用。介紹完原型模式的實(shí)現(xiàn)代碼之后,下面看下原型模式的類(lèi)圖,通過(guò)類(lèi)圖來(lái)理清原型模式實(shí)現(xiàn)中類(lèi)之間的關(guān)系。具體類(lèi)圖如下:

  三、原型模式的優(yōu)缺點(diǎn)

  原型模式的優(yōu)點(diǎn)有:

  原型模式向客戶(hù)隱藏了創(chuàng)建新實(shí)例的復(fù)雜性

  原型模式允許動(dòng)態(tài)增加或較少產(chǎn)品類(lèi)。

  原型模式簡(jiǎn)化了實(shí)例的創(chuàng)建結(jié)構(gòu),工廠方法模式需要有一個(gè)與產(chǎn)品類(lèi)等級(jí)結(jié)構(gòu)相同的等級(jí)結(jié)構(gòu),而原型模式不需要這樣。

  產(chǎn)品類(lèi)不需要事先確定產(chǎn)品的等級(jí)結(jié)構(gòu),因?yàn)樵湍J竭m用于任何的等級(jí)結(jié)構(gòu)

  原型模式的缺點(diǎn)有:

  每個(gè)類(lèi)必須配備一個(gè)克隆方法

  配備克隆方法需要對(duì)類(lèi)的功能進(jìn)行通盤(pán)考慮,這對(duì)于全新的類(lèi)不是很難,但對(duì)于已有的類(lèi)不一定很容易,特別當(dāng)一個(gè)類(lèi)引用不支持串行化的間接對(duì)象,或者引用含有循環(huán)結(jié)構(gòu)的時(shí)候。

  四、.NET中原型模式的實(shí)現(xiàn)

  在.NET中可以很容易地通過(guò)實(shí)現(xiàn)ICloneable接口(這個(gè)接口就是原型,提供克隆方法,相當(dāng)于與上面代碼中MonkeyKingPrototype抽象類(lèi))中Clone()方法來(lái)實(shí)現(xiàn)原型模式,如果我們想我們自定義的類(lèi)具有克隆的功能,首先定義類(lèi)繼承與ICloneable接口并實(shí)現(xiàn)Clone方法。在.NET中實(shí)現(xiàn)了原型模式的類(lèi)如下圖所示(圖中只截取了部分,可以用Reflector反編譯工具進(jìn)行查看):

【C語(yǔ)言編程中使用設(shè)計(jì)模式中的原型模式的講解】相關(guān)文章:

Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用的實(shí)例講解03-13

講解C語(yǔ)言編程中的結(jié)構(gòu)體對(duì)齊01-17

該怎么使用Java設(shè)計(jì)模式編程中的OCP開(kāi)閉原則?10-09

簡(jiǎn)單講解Java的Future編程模式方案09-15

PHP中的設(shè)計(jì)模式詳解10-08

C語(yǔ)言if語(yǔ)句的使用講解10-08

講解Java編程中finally語(yǔ)句的使用方法01-30

初步剖析C語(yǔ)言編程中的結(jié)構(gòu)體02-18

解析Java的設(shè)計(jì)模式編程之解釋器模式的運(yùn)用01-21