设计模式之原型

原型模式介绍

完整拷贝

原型模式主要解决的问题就是创建重复对象,而这部分对象内容本身比较复杂,生成过程可能从库或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。

原型模式是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类。

原型模式的特点

  • 在原型模式中所需要非常重要的手段就是克隆。

  • 原型模式的使用频率不是很高。

  • 在一个很复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑用原型。

便于通过克隆方式创造复杂对象,也可以避免重复做初始化操作,不需要与类中所属的其他类耦合。

优点:

  • 向客户隐藏制造新实例的复杂性

  • 提供让客户能够产生未知类型对象的选项

  • 在某些环境下,复制对象比创建新对象更有效

  • 可以用继承以外的方式来处理复杂对象的不同配置

缺点:

  • 对象的复制有时候很复杂

原型模式的结构

1、原型(Prototype)接口将对克隆进行声明。在绝大数情况下,其中只会有一个名为clone的方法。

2、具体原型(Concrete Prototype)类将实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖等等。

3、客户端(Client)可以复制实现了原型接口的任何对象。

所有的原型类都必须有一个通用的接口,使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生产自身的完整副本,因为相同类的对象可以相互访问对方的私有成员变量。

Demo

下面就以学生信息为例来简单学习下原型模式。入校时填写学生信息都是重复且简单的工作,如果我们把格式规定好,其余的学生按照一定的格式来编写,那么就可以使用原型模式。

    public class Student{public int Age;public DateTime BirthDate;public string Name;public IdInfo IdInfo;/// <summary>/// 浅拷贝/// </summary>/// <returns></returns>public Student ShallowCopy() {return (Student)this.MemberwiseClone();}/// <summary>/// 深拷贝/// </summary>/// <returns></returns>public Student DeepCopy(){Student clone = (Student)this.MemberwiseClone();clone.IdInfo = new IdInfo(IdInfo.IdNumber);clone.Name = String.Copy(Name);return clone;}}
    public class IdInfo {public int IdNumber;public IdInfo(int id){IdNumber = id;}    }
        static void Main(string[] args){Student student=new Student();student.Name = "阿辉";student.BirthDate = Convert.ToDateTime("1990-10-08");student.Age = 27;student.IdInfo = new IdInfo(001);Student studentTwo = student.ShallowCopy();var studentThree = student.DeepCopy();Console.WriteLine("学生信息");Console.WriteLine("One");DisplayValues(student);Console.WriteLine("Two");DisplayValues(studentTwo);Console.WriteLine("Three");DisplayValues(studentThree);Console.WriteLine("--------------------------");student.Name = "阿七";student.Age = 18;student.BirthDate = Convert.ToDateTime("2018-10-08");student.IdInfo.IdNumber = 002;Console.WriteLine("修改后学生信息");Console.WriteLine("One");DisplayValues(student);Console.WriteLine("Two");DisplayValues(studentTwo);Console.WriteLine("Three");DisplayValues(studentThree);Console.ReadKey();}public static void DisplayValues(Student s){Console.WriteLine("      Name: {0:s}, Age: {1:d}, BirthDate: {2:MM/dd/yy}",s.Name, s.Age, s.BirthDate);Console.WriteLine("      ID: {0:d}", s.IdInfo.IdNumber);}
输出结果

解释:

可以看到在第一次创建学生对象的时候浅拷贝和深拷贝的值都是一样的,和原始值一样。

当我们修改学生信息时,学生阿辉被修改为阿七,其余属性也被覆盖进行修改。此时看浅拷贝和深拷贝的数据,发现在浅拷贝的时候只有ID值被修改,其余值还和原数据一样,在深拷贝中输出的所有数据都和原始值一样,也就是说修改的数据,根本没有对深拷贝的数据进行覆盖,深拷贝是对原始值的复制。

所有的原型类都必须有一个通用的接口,使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生成自身的完整副本,因为相同类的对象可以相互访问对方的私有成员变量。

对于上面这句话,你品,你细品

虽然说原型模式使用的频次不是很多,但是我们需要大概知道如何使用,为什么使用。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为服务器停止响应,windows服务器停止工作

windows服务器停止工作 内容精选换一换无法通过远程桌面连接裸金属服务器时&#xff0c;我们推荐您按照以下思路排查问题。检查是否符合登录条件检查网络是否正常检查防火墙配置是否正常远程访问端口配置异常尝试重启裸金属服务器确认是否已经按照裸金属服务器登录前的准备工作…

专题1.1——Exchange2013部署前准备条件

本专题将主要介绍Exchange2013从部署前准备、正式部署到应用配置和维护的整个过程。博文是我在自己做测试的过程中自己编写的&#xff0c;如果大家有什么意见或问题也欢迎一起讨论交流。废话不多说&#xff0c;下面进入正题。本节将主要介绍部署Exchange2013之前需要准备的先决…

这些让人看瞎了的设计!实力证明,数学才是世界的最终boss!

全世界只有3.14 %的人关注了青少年数学之旅昨天小天刷微博&#xff0c;看到了一组动图&#xff0c;一时间我都不知道是我的眼睛出了错&#xff0c;还是我的大脑反应不过来。奇了怪了&#xff01;怎么箭头反转了180后&#xff0c;还是原样&#xff01;问题到底出在哪里&#xff…

你真的了解低代码平台吗?

从 2020 年疫情之后&#xff0c;低代码这个概念就突然变得火热起来&#xff0c;各大自媒体纷纷推出介绍低代码的文章&#xff0c;InfoQ 也曾发表过一篇《为什么我说低代码是“行业毒瘤”&#xff1f;》引发了热议&#xff0c;明道的创始人任向晖随后在自己的公众号写文章《低代…

图像还可以这样玩!如何用OpenCV处理图像?

全世界只有3.14 % 的人关注了青少年数学之旅人工智能近年来呈现爆发式发展&#xff0c;计算机视觉和深度学习作为人工智能的两大支柱学科&#xff0c;近年来得到迅速发展。今天小天将带着大家走进计算机视觉&#xff01;所谓计算机视觉&#xff0c;就是指用摄影机和电脑代替人眼…

java集合学习笔记 ---Collections类对集合的处理

2019独角兽企业重金招聘Python工程师标准>>> 包名:java.util.CollectionsCollections是个类&#xff0c;不是接口有以下方法&#xff0c;部分列举1.对List进行升序排序public static void sort(List list)如果要进行降序排序,可以在sort函数中制定降序public static…

如何入门.NET Core ? 推荐这10个优秀的开源项目!

.NET 5马上就要发布了&#xff0c;还不知道这些.NET Core开源项目&#xff1f;只推荐干货&#xff01;当然这些开源项目都是个人或组织开发的。1.Ant Design Blazor.NET进行客户端Web开发又一利器。微软官方认可&#xff0c;微软Build2020开发者大会Blazor介绍中&#xff0c;提…

.NET设计模式(7):创建型模式专题总结(Creational Pattern)

概述 创建型模式&#xff0c;就是用来创建对象的模式&#xff0c;抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。本文对五种常用创建型模式进行了比较&#xff0c;通过一个游戏开发场景的例子来说该如何使用创建型模式。 为什么需要创建型模式 所…

ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目

Abp vnext 4.4出现了一个比较重大的变更&#xff1a;在Startup template中移除了EF Core Migrations项目&#xff0c;本文翻译自community.abp.io/articl由于本文发布的时候Abp vnext的版本还没有到4.4&#xff0c;所以本文演示了如何从4.4以前的版本移除EntityFrameworkCore.D…

史上最变态高考数学题,让99%的考生献上膝盖,看完我惊了......

全世界只有3.14 %的人关注了青少年数学之旅今天超模君想问大家一个问题&#xff1a;如果在撒哈拉大沙漠或者是西伯利亚上建造一个大型装置&#xff0c;以便向地球之外的其他星球的朋友们表明地球上存在有智慧的生命&#xff0c;最适当的装置是什么呢&#xff1f;勾股定理&#…

C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并

C#操作Excel文件(读取Excel&#xff0c;写入Excel) 看到论坛里面不断有人提问关于读取excel和导入excel的相关问题。闲暇时间将我所知道的对excel的操作加以总结&#xff0c;现在共享大家&#xff0c;希望给大家能够给大家带了一定的帮助。另外我们还要注意一些简单的问题1.exc…

猪肉上的红章和蓝章有啥不同?| 今日趣图

全世界只有3.14 %的人关注了青少年数学之旅亲眼看到金字塔你才会意识到它有多大&#xff01;&#xff08;图源光消失的地方&#xff0c;侵权删&#xff09;你女朋友的脸皮有多厚&#xff1f;&#xff08;图源程序员新视界&#xff0c;侵权删&#xff09;猪肉上的红章和蓝章有啥…

如何避免和人尬聊?

全世界只有3.14 %的人关注了青少年数学之旅想要和别人有聊不完的话题&#xff1f;当然是多读书多看新闻了解新鲜有趣的事物啦如果你没有时间去阅读那么关注以下公号将会让你收获更多信息~长按二维码&#xff0c;选择“识别图中二维码”订阅。▼看鉴ID:kanjian6666▲长按二维码“…

java 中的 io 系统总结

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符&#xff0c;分别操作字符、字符数组或字符串&#xff0c;而字节流处理单元为 1 个字节&#xff0c;操作字节和字节数组。 Java 内用 Unicode 编码存储字符&#xff0c;字符流处理类负责将外部的…

在VS Code中执行SQL查询,是怎样一种体验?

上次&#xff0c;我们演示了“如何使用Nuget包XPlot.Plotly.Interactive在.NET Interactive notebook中绘制图表”。这次&#xff0c;我们使用Nuget包Microsoft.DotNet.Interactive.SqlServer演示在.NET Interactive notebook中如何和SQL Server交互。安装Nuget包首先&#xff…

UVA 11090 Going in Cycle!! 二分答案 + bellman-ford

求平均值最小的环&#xff0c;如果平均值最小为x&#xff0c;则如果把每条边的权值都减(x1)&#xff0c;那么新图将会有负环&#xff0c;用bellman ford判断。 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstri…

大数据:数据合集,你想要的或许这里都有

大数据时代&#xff0c;用数据做出理性分析显然更为有力。做数据分析前&#xff0c;能够找到合适的的数据源是一件非常重要的事情&#xff0c;获取数据的方式有很多种&#xff0c;不必局限。下面将从公开的数据集、爬虫、数据采集工具、付费API等等介绍。给大家推荐一些能够用得…

MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

在Membership系列的最后一篇引入了ASP.NET Identity&#xff0c;看到大家对它还是挺感兴趣的&#xff0c;于是来一篇详解登录原理的文章。本文会涉及到Claims-based&#xff08;基于声明&#xff09;的认证&#xff0c;我们会详细介绍什么是Claims-based认证&#xff0c;它与传…

一步一步SharePoint 2007之四十三:实现自定义Workflow(2)——设置配置文件

下面将记录每一步的操作过程。1、首先采用Reflector等工具找到上一篇文章编译后的DLL的Assembly信息。2、找到并打开C:\Inetpub\wwwroot\wss\VirtualDirectories\9001\web.config文件&#xff0c;在System.Workflow.ComponentModel.WorkflowCompiler节点下的authorizedTypes中&…

动手造轮子 —— dotnet-HTTPie

动手造轮子 —— dotnet-HTTPieIntroHTTPie 是一个基于 Python 的 HTTP CLI 工具&#xff0c;这也意味着想用 HTTPie 就需要安装 Python 环境&#xff0c;不想装 Python 环境&#xff0c;于是想用 C# 也写一个类似的东西&#xff0c;HTTPie 的语法很简单、简洁而且功能强大&…