c#中原型模式详解

这篇具有很好参考价值的文章主要介绍了c#中原型模式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础介绍:

  具体可分为2个角色:

    Prototype(原型类):声明一个Clone自身的接口;

    ConcretePrototype(具体原型类):,实现一个Clone自身的操作。

  在原型模式中,Prototype通常提供一个包含Clone方法的接口,具体的原型ConcretePrototype使用Clone方法完成对象的创建。

 

  本质:通过拷贝这些原型对象创建新的对象。

  根据其本质可以理解,原型本身就是通过一个自身的Clone方法来进行自我复制,从而产生新的对象。

  比如,孙猴子吹猴毛变化多个克隆体时,就是用了原型模式,通过对自身的自我复制从而生产出N个分身。

  所以从本质出发,想要实现这个功能,可以引出两个概念:其一就是浅层复制,再则就是深层复制

  浅层复制:通过this.MemberWiseClone(),对实例的值类型进行拷贝(包含string类型),对引用类型只拷贝了引用。浅拷贝只对值类型成员进行复制,对于引用类型,只是复制了其引用,并不复制其对象。

  深层复制需要通过反射和序列化来实现。

 

应用场景:

 对象在创建(new)时,消耗资源过多繁琐耗时。

  本质就是在对象的构造函数中有耗时长或者占用系统资源多的情况,

  使用原型模式进行复制对象时,可以省去这些耗时耗力的操作,直接获得对象的具体实例。

  最常见的使用场景之一就是对象历史节点的保存,比如在对对象进行操作一次后,进行一次复制保存当前状态(恢复到某一历史状态),可实现撤销操作。

创建方式:

  1. 原型类----用来规范具体原型

    c#中原型模式详解c#中原型模式详解
     1     /// <summary>
     2     /// 原型类
     3     /// </summary>
     4     public abstract class Prototype
     5     {
     6         /// <summary>
     7         /// 值类型
     8         /// </summary>
     9         public int Id { get; set; }
    10 
    11         /// <summary>
    12         /// 字符串
    13         /// </summary>
    14         public string strMessage { get; set; }
    15 
    16         /// <summary>
    17         /// 引用类型
    18         /// </summary>
    19         public Dictionary<int, string> keyValuePairs = new Dictionary<int, string>() { };
    20 
    21         /// <summary>
    22         /// 构造函数
    23         /// </summary>
    24         /// <param name="id"></param>
    25         public Prototype(int id)
    26         {
    27             this.Id = id;
    28         }
    29 
    30         /// <summary>
    31         /// 复制函数
    32         /// </summary>
    33         /// <returns></returns>
    34         public abstract Prototype Clone();
    35     }
    View Code

    通过上述代码可以看出,为了更好的展示原型类的特性,原型类中声明了值类型和引用类型来展示各自的变化。

  2. 具体原型类

    c#中原型模式详解c#中原型模式详解
     1     /// <summary>
     2     /// 创建具体原型
     3     /// </summary>
     4     public class ConcretePrototype : Prototype
     5     {
     6         public ConcretePrototype(int id)
     7             : base(id)
     8         { }
     9 
    10         /// <summary>
    11         /// 浅拷贝
    12         /// </summary>
    13         /// <returns></returns>
    14         public override Prototype Clone()
    15         {
    16             // 调用MemberwiseClone方法实现的是浅拷贝,另外还有深拷贝
    17             return (Prototype)this.MemberwiseClone();
    18         }
    19     }
    View Code

    通过MemberwiseClone方法实现浅拷贝,即复制值类型属性生成新的,而引用类型的属性只复制其引用,并没有生成新的。

  3. 客户端调用

    c#中原型模式详解c#中原型模式详解
     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             ConcretePrototype concretePrototype = new ConcretePrototype(1);
     6             concretePrototype.strMessage = "AAAAAAAAA";
     7             concretePrototype.keyValuePairs.Add(1, "A");
     8             concretePrototype.keyValuePairs.Add(2, "B");
     9             Console.WriteLine("id:{0}", concretePrototype.Id);
    10             Console.WriteLine("strMessage:{0}", concretePrototype.strMessage);
    11             Console.WriteLine("keyValuePairs:");
    12             foreach (KeyValuePair<int,string> item in concretePrototype.keyValuePairs)
    13             {
    14                 Console.WriteLine("KEY:{0}  Value:{1}", item.Key, item.Value);
    15             }
    16 
    17             Console.WriteLine("\r\n");
    18 
    19             ConcretePrototype concretePrototype2 = (ConcretePrototype)concretePrototype.Clone();
    20             concretePrototype2.strMessage = "BBBBBBBBB";
    21             concretePrototype2.keyValuePairs[1] = "A1";
    22             Console.WriteLine("id:{0}", concretePrototype2.Id);
    23             Console.WriteLine("strMessage:{0}", concretePrototype2.strMessage);
    24             Console.WriteLine("keyValuePairs:");
    25             foreach (KeyValuePair<int, string> item in concretePrototype2.keyValuePairs)
    26             {
    27                 Console.WriteLine("KEY:{0}  Value:{1}", item.Key, item.Value);
    28             }
    29 
    30             Console.WriteLine("\r\n");
    31 
    32             Console.WriteLine("id:{0}", concretePrototype.Id);
    33             Console.WriteLine("strMessage:{0}", concretePrototype.strMessage);
    34             Console.WriteLine("keyValuePairs:");
    35             foreach (KeyValuePair<int, string> item in concretePrototype.keyValuePairs)
    36             {
    37                 Console.WriteLine("KEY:{0}  Value:{1}", item.Key, item.Value);
    38             }
    39             Console.ReadKey();
    40         }
    41     }
    View Code

    c#中原型模式详解

    上述代码中,首先创建了一个concretePrototype原型对象,然后给字符串类型的strMessage赋值“AAAAAAAAA”。 然后给引用类型的keyValuePairs字典添加key=1和key=2,值分别是A和B。

    通过Clone()方法进行原型对象的复制操作,生成新对象concretePrototype2。

    修改新对象中的strMessage属性和keyValuePairs字典中key=1的值为“A1”。

    通过打印出的内容可以看出新对象中的strMessage值修改并不会影响原型对象中的内容,而引用类型keyValuePairs则发生了改变。

    通过这个实例可以看出浅复制,对值类型进行全盘拷贝,对引用类型只拷贝了引用地址。

  4. 修改上述实例,将浅复制改为深复制

    c#中原型模式详解c#中原型模式详解
     1     /// <summary>
     2     /// 原型类
     3     /// </summary>
     4     [Serializable]
     5     public abstract class Prototype
     6     {
     7         ......
     8     }    
     9 
    10         /// <summary>
    11     /// 创建具体原型
    12     /// 如果是要通过序列化来进行深拷贝的话,要打上Serializable标签
    13     /// </summary>
    14     [Serializable]
    15     public class ConcretePrototype : Prototype
    16     {
    17         public ConcretePrototype(int id)
    18             : base(id)
    19         { }
    20 
    21         /// <summary>
    22         /// 深拷贝
    23         /// </summary>
    24         /// <returns>返回一个全新的Person对象</returns>
    25         public override Prototype Clone()
    26         {
    27             //创建一个内存流
    28             MemoryStream ms = new MemoryStream();
    29             //创建一个二进制序列化对象
    30             BinaryFormatter bf = new BinaryFormatter();
    31             //将当前对象序列化写入ms内存流中
    32             bf.Serialize(ms, this);
    33             //设置流读取的位置
    34             ms.Position = 0;
    35             //将流反序列化为Object对象
    36             return bf.Deserialize(ms) as Prototype;
    37         }
    38     }
    View Code

    上述实例通过序列化进行深复制,当然也可以使用反射等技术进行深复制。

    c#中原型模式详解

    运行后可以看出,深复制后引用类型也会生成一个新的地址。

总结:

 原型模式就是对对象进行复制操作,而避免重复进行初始化操作,生产多个克隆对象。

  

  文章来源地址https://www.toymoban.com/news/detail-745915.html

到了这里,关于c#中原型模式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式-原型模式详解

    简介设计模式 设计模式是在软件开发中常见问题的解决方案,它们是经过实践和经验总结出来的可重用的设计思想和解决方案。设计模式通过提供通用的架构、原则和指导,帮助开发人员更有效地编写高质量的代码。 设计模式分为三个主要类别: 创建型模式:关注对象的创

    2024年02月10日
    浏览(36)
  • 介绍原型模式:快速构建和复制对象的设计模式

    经过瀑布模式之后,我们不禁想要用模型解决更多的问题,最重要的就是不再单向行径。 由此,介绍 原型模式, 所谓原型,就是我们有一个框架或者初始角色。我们可以根据项目的不同,对它进行不同的修改,使它适配。 在软件开发中,经常会遇到需要创建和复制对象的情

    2024年02月12日
    浏览(39)
  • 设计模式之原型模式详解

    在设计模式的系列文章中,我们前面已经写了 工厂模式 、 单列模式 、 建造者模式 ,在针对创建型模式中,今天想跟大家分享的是 原型模式 ,我觉的这种模式叫克隆模式会更佳恰当。原型模式的目的就是通过复制一个现有的对象来生成一个新的对象。 原型模式 使用原型实

    2024年02月12日
    浏览(43)
  • Python原型模式介绍、使用;浅拷贝/深拷贝原理

            1. 概念 原型模式是一种创建型设计模式,它通过复制(克隆)现有对象来创建新对象。这样可以避免使用复杂的构造函数来创建对象,提高程序的性能和可维护性。         2. 功能 原型模式的功能是通过复制现有对象来创建新对象,从而提高程序的性能和可维护性

    2024年02月15日
    浏览(41)
  • 微信小程序自定义tabbar,分为医生端和患者端模拟不同角色登录

    介绍微信小程序如何自定义tabbarr界面,使用开发环境为微信开发原生工具,本文案例: 小程序有两个角色用户——医生端、患者端,每个角色进入小程序之后都有其所对应的tabbar界面, 隔离角色的权限,医生端无法进入患者端,患者端无法进入医生端。 1 成果展示 小程序

    2024年04月13日
    浏览(34)
  • 【设计模式——学习笔记】23种设计模式——原型模式Prototype(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    原型模式指用通过拷贝原型实例创建新的实例,新实例和原型实例的属性完全一致 原型模式是一种创建型设计模式 工作原理是通过调用原型实例的 clone() 方法来完成克隆,原型实例需要实现Cloneable接口,并重写 clone() 方法 需要为每个类开发一个克隆方法,这对全新的类来说

    2024年02月16日
    浏览(52)
  • 【java设计模式】创建型模式介绍(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)

    简介 本文介绍Java设计模式中创建型模式的五种 一、工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工

    2024年02月16日
    浏览(47)
  • Java原型模式详解:克隆人案例【深浅克隆】

    前言 在许多情况下,我们需要创建对象的副本,比如在初始化操作比较复杂或者需要大量资源的情况下。在这些情况下,我们可以使用原型模式来避免重复创建对象,提高程序的性能。本文将介绍Java中的原型模式以及如何在实际应用中使用它。 原型模式(Prototype Pattern)属

    2024年02月05日
    浏览(42)
  • 安全和权限管理:安全模式和角色基础设施

    在现代计算机系统中,安全和权限管理是一个至关重要的领域。随着互联网的普及和数字化进程的加快,计算机系统面临着越来越多的安全威胁。为了保护系统和数据的安全,我们需要一种有效的安全模式和角色基础设施。本文将深入探讨这两个方面的概念、原理和实践,并

    2024年02月20日
    浏览(41)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包