亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#編程中使用設計模式中的原型模式的實例講解

2020-01-24 01:16:22
字體:
來源:轉載
供稿:網友

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

二、原型模式的詳細介紹
我們來看一個入學考試場景實例

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

原型模式的復職克?。焊鶕枰∷⒖季恚@里的考卷都是復制考試題樣卷

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

類圖:

2016217153039715.png (784×574)

接口:試卷樣例代碼

  /// <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 知道設計模式嗎    {      get;      set;    }    string 設計模式有幾種    {      get;      set;    }    string 你知道那些    {      get;      set;    }    SelectTest 附加題    {      get;      set;    }    Test Test    {      get;      set;    }    Test Test1    {      get;      set;    }  }


復制克?。簭陀C

 /// <summary>  /// 繼承Itest接口  /// </summary>  public class Test : Itest  {    private string one;    private string two;    private string three;    private SelectTest other=new SelectTest();    public string 知道設計模式嗎    {      get      {        return this.one;      }      set      {        this.one = value;      }    }    public string 設計模式有幾種    {      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()    {      //克隆當前類      return (Itest)this.MemberwiseClone();    }    #endregion  }

客戶端,發卷做題

 static void Main()    {      //印刷試卷      Itest test = new Test();      //復制樣本試卷      Itest test1 = test.Clone();            //考生1      test.設計模式有幾種 = "23";      test.附加題.你老婆多大 = "18";      //考生2      test1.設計模式有幾種 = "24";      test1.附加題.你老婆多大 = "20";      //顯示考生答卷內容      Console.WriteLine("test設計模式有幾種:" + test.設計模式有幾種);  //23      Console.WriteLine("test附加題.你老婆多大:" + test.附加題.你老婆多大);  //20      Console.WriteLine("test1設計模式有幾種:" + test1.設計模式有幾種);  //24      Console.WriteLine("test1附加題.你老婆多大:" + test1.附加題.你老婆多大); //20      Console.ReadKey();    }

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

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

解決方案:

 public Itest Clone()    {      //克隆當前類      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 知道設計模式嗎    {      get;      set;    }    string 設計模式有幾種    {      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 知道設計模式嗎    {      get      {        return this.one;      }      set      {        this.one = value;      }    }    public string 設計模式有幾種    {      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);    }  }

這就是對原型模式的運用。介紹完原型模式的實現代碼之后,下面看下原型模式的類圖,通過類圖來理清原型模式實現中類之間的關系。具體類圖如下:

2016217153142427.png (758×262)

三、原型模式的優缺點

原型模式的優點有

原型模式向客戶隱藏了創建新實例的復雜性
原型模式允許動態增加或較少產品類。
原型模式簡化了實例的創建結構,工廠方法模式需要有一個與產品類等級結構相同的等級結構,而原型模式不需要這樣。
產品類不需要事先確定產品的等級結構,因為原型模式適用于任何的等級結構

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


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

2016217153206825.png (378×557)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产91久久久久福利| 国产成人在线一区| 久久伊人精品视频| 国产91露脸中文字幕在线| 国产盗摄xxxx视频xxx69| 欧美激情亚洲视频| 亚洲精品成人av| 欧美性极品少妇精品网站| 日韩欧美成人免费视频| 91最新在线免费观看| 国产精品久久久久国产a级| 久久69精品久久久久久久电影好| 欧美国产日韩一区二区在线观看| 久久久久久久久久久免费精品| 精品亚洲一区二区三区| 亚洲国产精品va在线看黑人| 国产精品美乳一区二区免费| 亚洲精品一二区| 性色av一区二区三区红粉影视| 欧美视频在线免费看| 欧美高清视频在线| 国产成人鲁鲁免费视频a| 久久久久久香蕉网| 欧美日韩免费在线| 亚洲国产精品系列| 亚洲奶大毛多的老太婆| 亚洲美女视频网站| 国产成人一区二区三区电影| 国产精品久久久久影院日本| 欧美性xxxxxx| 一道本无吗dⅴd在线播放一区| 亚洲bt欧美bt日本bt| 欧美黄色www| 国内偷自视频区视频综合| 亚洲专区在线视频| 亚洲精品福利在线| 国色天香2019中文字幕在线观看| 欧美日韩第一页| 青青久久av北条麻妃黑人| 在线观看久久久久久| 日韩在线不卡视频| 欧美成人在线免费| 亚洲一区二区三区在线免费观看| 欧美成人亚洲成人日韩成人| 91在线免费视频| 欧洲亚洲妇女av| 成人福利视频在线观看| 国产一区二区黄| 欧美精品做受xxx性少妇| 久久琪琪电影院| 国产一区二区三区中文| 国产在线视频欧美| 日本久久91av| 亚洲第一网站免费视频| 日韩精品免费在线播放| 日韩欧美一区二区三区| 亚洲天堂男人天堂女人天堂| 欧美激情2020午夜免费观看| 久久成人综合视频| 国产成人在线播放| 中文字幕精品在线视频| 日韩在线视频二区| 国产69精品99久久久久久宅男| 国产精品黄色影片导航在线观看| 亚洲午夜精品久久久久久久久久久久| 亚洲在线www| 国内自拍欧美激情| 精品国内产的精品视频在线观看| 黄色成人av网| 成人免费观看网址| 日韩福利伦理影院免费| 精品久久久久久中文字幕一区奶水| 国产精品久久久久久五月尺| 亚洲视频国产视频| 成人免费激情视频| 久久免费国产视频| 欧美整片在线观看| 91爱爱小视频k| 欧美亚洲成人免费| 国内外成人免费激情在线视频网站| 精品一区二区三区四区| 欧美亚洲成人免费| 91精品啪aⅴ在线观看国产| 91欧美激情另类亚洲| 亚洲国产毛片完整版| 国产欧美精品在线播放| 欧美大片第1页| 成人精品网站在线观看| 午夜精品久久久99热福利| 成人av番号网| 亚洲色图狂野欧美| 欧美一区二区三区精品电影| 欧美激情在线观看视频| 欧美成人久久久| 亚洲综合视频1区| 日本午夜在线亚洲.国产| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩一区视频在线| 亚洲网站在线看| 精品中文字幕久久久久久| 精品高清一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 欧美黑人狂野猛交老妇| 欧美日韩国产第一页| 日韩美女主播视频| 91在线观看免费观看| 91精品久久久久久久久久入口| 欧美久久久精品| 欧美精品性视频| 日韩欧美在线中文字幕| 岛国av午夜精品| 免费不卡在线观看av| 日韩欧美在线视频日韩欧美在线视频| 蜜臀久久99精品久久久久久宅男| 国产精品午夜一区二区欲梦| 亚洲欧洲一区二区三区久久| 久久国产精品99国产精| 亚洲男人av电影| 成人免费午夜电影| 美日韩在线视频| 国产精品视频久久| 高清一区二区三区四区五区| 日韩av在线播放资源| 日韩视频永久免费观看| 国产在线观看91精品一区| 久久人人爽人人爽人人片亚洲| 国产一区在线播放| 97超碰国产精品女人人人爽| 久久视频中文字幕| 欧美一区三区三区高中清蜜桃| 91麻豆桃色免费看| 色偷偷亚洲男人天堂| 9.1国产丝袜在线观看| 91成人精品网站| 亚洲无线码在线一区观看| 国产成人精品久久久| 色视频www在线播放国产成人| 亚洲人在线观看| 另类专区欧美制服同性| 成人欧美一区二区三区在线| 亚洲男人第一网站| 欧美精品videossex性护士| 美女扒开尿口让男人操亚洲视频网站| 视频在线一区二区| 96sao精品视频在线观看| 亚洲精品动漫久久久久| 国产精品久久av| 91久久精品在线| 欧美日韩在线视频一区二区| 久久久免费av| 欧美日韩国产91| 4k岛国日韩精品**专区| 国产丝袜精品第一页| 亚洲性生活视频在线观看| 国产精品中文字幕久久久| 精品偷拍各种wc美女嘘嘘| 欧美一乱一性一交一视频| 日韩在线观看免费| 91综合免费在线| 久久久精品国产网站| 668精品在线视频| 欧美黄色三级网站| 色先锋资源久久综合5566| 国产成人一区二|