.NET原型模式講解

來源:互聯網
上載者:User
原型模式的定義:

用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。

原型模式結構圖:

建立型模式中一個比較特殊的模式-原型模式,有個最大的特點是複製一個現有的對象,這個複製的結果有2種,一種是淺度複製,另一種是深度複製。

建立型模式一般是用來建立一個新的對象,然後我們使用這個對象完成一些對象的操作,我們通過原型模式可以快速的建立一個對象而不需要提供專門的new()操作就可以快速完成對象的建立,這無疑是一種非常有效方式,快速的建立一個新的對象。

1.原型模式:淺度複製

定義一個介面, 用來表述所有的顏色對象介面

/// <summary>/// 顏色介面/// </summary>public interface IColor{  IColor Clone();  int Red { get; set; }  int Green { get; set; }  int Blue { get; set; }}

給出紅色的具體實現代碼:

public class RedColor:IColor{  public int Red { get; set; }  public int Green { get; set; }  public int Blue { get; set; }   public IColor Clone()  {    return (IColor)this.MemberwiseClone();  }}

具體的測試代碼如下:

static void Main(string[] args){  IColor color = new RedColor();  color.Red = 255;  Console.WriteLine("color -red " + color.Red); //225  IColor color1 = color.Clone();  color1.Red = 224;  Console.WriteLine("color1-red " + color1.Red);//224  Console.WriteLine("color -red " + color.Red); //225}

可以發現:在我們修改color1對象的Red屬性值,沒有對color的屬性參生影響,即對象副本的修改不會影響對象本身的狀態。

2.原型模式:深度複製

深複製考慮的情況相對來說就會比較複雜,因為有可能對象是之間有繼承關係或者參考關聯性的時候,可能我們深複製的時候就需要注意.一般來說深複製一方面可以採用種簡單的深複製對象的時候的方案,還可以通過序列化的形式來進行對象的複製。下面通過序列化的形式來實現原型模式:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication4{  /// <summary>  /// 顏色介面  /// </summary>  public interface IColor  {    IColorDemo Clone();     int Red { get; set; }    int Green { get; set; }    int Blue { get; set; }    Factroy f{get;set;}  }   /// <summary>  /// 生產顏色的工廠資訊  /// </summary>  [Serializable]  public class Factroy  {    public string name { get; set; }  }} using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication4{  /// <summary>  /// 顏色  /// </summary>  [Serializable]  public class RedColor:IColor  {    public int Red { get; set; }    public int Green { get; set; }    public int Blue { get; set; }    public Factroy f { get; set; }     public IColor Clone()    {      SerializableHelper s = new SerializableHelper();      string target = s.Serializable(this);      return s.Derializable<IColor>(target);    }  }}

序列化協助類:

/// <summary>  /// 序列化和還原序列化輔助類  /// </summary>  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);    }  }

測試:

static void Main(string[] args){  IColor color = new RedColor();  color.Red = 255;  color.f = new Factroy() { name="湖北工廠" };  Console.WriteLine("color - Factroy:" + color.f.name); //湖北工廠   IColor color1 = color.Clone();  color1.Red = 234;  color1.f.name = "北京工廠";  Console.WriteLine("color1- Factroy:" + color1.f.name); //北京工廠  Console.WriteLine("color - Factroy:" + color.f.name); //湖北工廠  Console.Read();}

程式的運行結果如下:

結論:通過序列化和還原序列化形成新的對象。其實只要是項目中要使用原型模式進行對象複製的情況下,都可以通過序列化的形式來進行深複製。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.