欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁 > 軟件編程 > C#教程 >

C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次

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

二、原型模式的詳細(xì)介紹
我們來看一個入學(xué)考試場景實(shí)例

基對象(一般為接口,抽象類):考試題(樣卷)

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

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

類圖:

接口:試卷樣例代碼

  /// <summary>
  /// 選答題
  /// </summary>
  public class SelectTest
  {
    private string other;
    public string 你老婆多大
    {
      get
      {
        return this.other;
      }
      set
      {
        this.other = value;
      }
    }
  }
  /// <summary>
  /// 面試題
  /// </summary>
  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ī)

 /// <summary>
  /// 繼承Itest接口
  /// </summary>
  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()
    {
      //克隆當(dāng)前類
      return (Itest)this.MemberwiseClone();
    }
    #endregion
  }

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

 static void Main()
    {
      //印刷試卷
      Itest test = new Test();
      //復(fù)制樣本試卷
      Itest test1 = test.Clone();
      
      //考生1
      test.設(shè)計(jì)模式有幾種 = "23";
      test.附加題.你老婆多大 = "18";

      //考生2
      test1.設(shè)計(jì)模式有幾種 = "24";
      test1.附加題.你老婆多大 = "20";

      //顯示考生答卷內(nèi)容
      Console.WriteLine("test設(shè)計(jì)模式有幾種:" + test.設(shè)計(jì)模式有幾種);  //23
      Console.WriteLine("test附加題.你老婆多大:" + test.附加題.你老婆多大);  //20
      Console.WriteLine("test1設(shè)計(jì)模式有幾種:" + test1.設(shè)計(jì)模式有幾種);  //24
      Console.WriteLine("test1附加題.你老婆多大:" + test1.附加題.你老婆多大); //20

      Console.ReadKey();
    }

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

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

解決方案:

 public Itest Clone()
    {
      //克隆當(dāng)前類
      Itest itst= (Itest)this.MemberwiseClone();
      SelectTest st = new SelectTest();
      st.你老婆多大 = this.other.你老婆多大;
      itst.附加題 = st;
      return itst;

    } 


使用序列化解決

/// <summary>
  /// 選答題
  /// </summary>
  [Serializable] 
  public class SelectTest
  {
    private string other;
    public string 你老婆多大
    {
      get
      {
        return this.other;
      }
      set
      {
        this.other = value;
      }
    }
  }
  /// <summary>
  /// 面試題
  /// </summary>
  public interface Itest
  {
    Itest Clone();

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

  /// <summary>
  /// 繼承Itest接口
  /// </summary>

  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<Itest>(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<T>(string target)
    {
      return (T)Derializable(target);
    }
  }

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

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

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

原型模式向客戶隱藏了創(chuàng)建新實(shí)例的復(fù)雜性
原型模式允許動態(tài)增加或較少產(chǎn)品類。
原型模式簡化了實(shí)例的創(chuàng)建結(jié)構(gòu),工廠方法模式需要有一個與產(chǎn)品類等級結(jié)構(gòu)相同的等級結(jié)構(gòu),而原型模式不需要這樣。
產(chǎn)品類不需要事先確定產(chǎn)品的等級結(jié)構(gòu),因?yàn)樵湍J竭m用于任何的等級結(jié)構(gòu)

原型模式的缺點(diǎn)有:
每個類必須配備一個克隆方法
配備克隆方法需要對類的功能進(jìn)行通盤考慮,這對于全新的類不是很難,但對于已有的類不一定很容易,特別當(dāng)一個類引用不支持串行化的間接對象,或者引用含有循環(huán)結(jié)構(gòu)的時候。


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

上一篇:C#委托與事件初探

欄    目:C#教程

下一篇:C#實(shí)現(xiàn)PDF文件添加圖片背景

本文標(biāo)題:C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6693.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有