.NET原型模式讲解

 更新时间:2016年11月25日 17:19:00   作者:Yangyi.He  
这篇文章主要为大家详细介绍了ASP.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(); 
    } 
  }

具体的测试代码如下:

    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();
  }

程序的运行结果如下:


结论:通过序列化和反序列化形成新的对象。其实只要是项目中要使用原型模式进行对象复制的情况下,都可以通过序列化的形式来进行深复制。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • asp.net URL编码与解码

    asp.net URL编码与解码

    通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义
    2011-12-12
  • C# FTP,GetResponse(),远程服务器返回错误

    C# FTP,GetResponse(),远程服务器返回错误

    C# FTP,GetResponse(),远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)
    2009-06-06
  • ASP.NET上传图片并生成可带版权信息的缩略图

    ASP.NET上传图片并生成可带版权信息的缩略图

    ASP.NET上传图片并生成可带版权信息的缩略图...
    2006-09-09
  • Visual Studio for Mac版 初体验

    Visual Studio for Mac版 初体验

    这篇文章主要介绍了Visual Studio for Mac版 初体验,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2017-05-05
  • 不可忽视的 .NET 应用5大性能问题

    不可忽视的 .NET 应用5大性能问题

    ASP.NET 或是 Windows Forms 容器中,使用 ADO 库与运行在 CLR 交互,而 CLR 运行在操作系统中而该硬件又与其他包含不同技术堆栈的硬件通过网络相连。在你的应用与外部环境之间,。我们还有 API 管理服务以及多级缓存基础构造数量庞杂,都可能影响应用程序的性能!
    2016-05-05
  • C#中的Equals、RefrenceEquals和==的区别与联系

    C#中的Equals、RefrenceEquals和==的区别与联系

    C#中判断两个对象是否相等有Equals、RefrenceEquals和==三种,其中==为运算符,其它两个为方法,而Equals又有两种版本,一个是静态的,一个是虚拟的,详细了解可以参考本文
    2012-12-12
  • 发布一个基于TokyoTyrant的C#客户端开源项目

    发布一个基于TokyoTyrant的C#客户端开源项目

    目前在网上关于TokyoCabinet(以下简称TC)和TokyoTyrant(以下简称TT)的资料已相对丰富了,但在.NET平台上的客户端软件却相对匮乏,因为做Discuz!NT企业版的关系,两个月前开始接触TC和TT,开始写相关的客户端代码。
    2010-07-07
  • 浅谈ASP.NETCore统一处理404错误都有哪些方式

    浅谈ASP.NETCore统一处理404错误都有哪些方式

    本文主要介绍了ASP.NETCore统一处理404错误都有哪些方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SqlCommandBuilder类批量更新excel或者CSV数据的方法

    SqlCommandBuilder类批量更新excel或者CSV数据的方法

    这篇文章主要介绍了SqlCommandBuilder类批量更新excel或者CSV数据的方法,需要的朋友可以参考下
    2015-10-10
  • 利用Typings为Visual Studio Code实现智能提示功能

    利用Typings为Visual Studio Code实现智能提示功能

    最近在学习Node.js及ThinkJS这个框架,用vscode作为开发环境。默认情况下vscode对ThinkJS的代码提示并不好,所以研究了一下,原来可以同通过Typings来让vscode拥有强大的智能代码提示功能。下面本文就介绍了如何利用Typings为Visual Studio Code实现智能提示功能。
    2017-02-02

最新评论