.NET原型模式講解

高洛峰
發布: 2016-12-10 09:20:29
原創
1114 人瀏覽過

原型模式的定義:

用原型實例指定建立物件的種類,並且透過拷貝這些原型建立新的物件。

原型模式結構圖:

.NET原型模式講解

創建型模式中一個比較特殊的模式-原型模式,有個最大的特點是克隆一個現有的對象,這個克隆的結果有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();
  }
}
登入後複製

   

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

2.原型模式:深度複製

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

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
}
登入後複製

   

序列化幫助類別:

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);
    }
  }
}
登入後複製

   

測試

結論:透過序列化和反序列化形成新的物件。其實只要是專案中要使用原型模式進行物件複製的情況下,都可以透過序列化的形式來進行深複製。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板