设计模式系列 - 原型模式

所谓原型模式是指为创建重复对象提供一种新的可能。

介绍

当面对系统资源紧缺的情况下,如果我们在重新创建一个新的完全一样的对象从某种意义上来讲是资源的浪费,因为在新对象的创建过程中,是会有系统资源的消耗,而为了尽可能的节省系统资源,我们有必要寻找一种新的方式来创建重复对象。

类图描述

749711-20181110212623378-1391325987.png

由于Shape 抽象类继承了 ICloneable 接口,所以通过上图我们可以发现,所有具体的类型都继承 Shape 抽象类,并实现 Clone() 方法即可。

代码实现

1、定义具有抽象基类

public abstract class Shape : ICloneable
{private string id;protected string type;public abstract void Draw();public string GetId() => id;public string GetType() => type;public void SetId(string id) => this.id = id;public new object MemberwiseClone() => base.MemberwiseClone();public abstract object Clone();
}

2、定义具体类型

public class Circle:Shape
{public Circle() => type = "Circle";public override void Draw(){Console.WriteLine("I am a Circle");}public override object Clone(){Circle obj = new Circle();obj.type = type;obj.SetId(this.GetId());return obj;}
}public class Rectangle:Shape
{public Rectangle() => type = "Rectangle";public override void Draw(){Console.WriteLine("I am a Rectangle");}public override object Clone(){Rectangle obj = new Rectangle();obj.type = type;obj.SetId(this.GetId());return obj;}
}public class Square:Shape
{public Square() => type = "Square";public override void Draw(){Console.WriteLine("I am a Square");}public override object Clone(){Square obj = new Square();obj.type = type;obj.SetId(this.GetId());return obj;}
}

3、创建种子数据

public class ShapeCache
{private  static  HashSet<Shape> shapeMap = new HashSet<Shape>();public static Shape GetShape(string shapeId){var cachedShape = shapeMap.FirstOrDefault(p => p.GetId() == shapeId);return (Shape) cachedShape?.Clone();}public static void LoadCache(){Circle circle = new Circle();circle.SetId("1");shapeMap.Add(circle);Square square = new Square();square.SetId("2");shapeMap.Add(square);Rectangle rectangle = new Rectangle();rectangle.SetId("3");shapeMap.Add(rectangle);}
}

4、上层调用

class Program
{static void Main(string[] args){ShapeCache.LoadCache();Shape clonedShape1 = (Shape) ShapeCache.GetShape("1");Console.WriteLine(clonedShape1.GetType());clonedShape1.Draw();Shape clonedShape2 = (Shape)ShapeCache.GetShape("2");Console.WriteLine(clonedShape2.GetType());clonedShape2.Draw();Shape clonedShape3 = (Shape)ShapeCache.GetShape("3");Console.WriteLine(clonedShape3.GetType());clonedShape3.Draw();Console.ReadKey();}
}

总结

C# 中实现原型模式的关键是需要定义一个继承 ICloneable 接口的抽象类,并在子类中重写相应的 Clone() 方法即可。

转载于:https://www.cnblogs.com/hippieZhou/p/9940504.html

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

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

相关文章

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)

图像二值化&#xff08;Image Binarization&#xff09;&#xff1a;平均值法、双峰法、大津算法&#xff08;OTSU&#xff09; 编程实现图像的二值化&#xff0c;分析不同的阈值对二值化图像的影响。 问题描述 传统的机器视觉通常包括两个步骤&#xff1a;预处理和物体检测…

全球最快AI超级计算机开动,每秒4百亿亿浮点运算!正拼接最大宇宙3D地图

来源&#xff1a;venturebeat宇宙是在不断膨胀的吗&#xff1f;是的&#xff01;而令宇宙不断膨胀的「罪魁祸首」就是暗能量。作为是宇宙中最神秘的物质&#xff0c;它看不见摸不着&#xff0c;为了捕捉它&#xff0c;人类在地球上建立了许多相关实验&#xff0c;但都成效甚微。…

基于YOLOv5的中式快餐店菜品识别系统

基于YOLOv5的中式快餐店菜品识别系统[金鹰物联智慧食堂项目] 摘要 本文基于YOLOv5v6.1提出了一套适用于中式快餐店的菜品识别自助支付系统&#xff0c;综述了食品识别领域的发展现状&#xff0c;简要介绍了YOLOv5模型的历史背景、发展优势和网络结构。在数据集预处理过程中&am…

谋局科技创新:两院院士大会释放重要信号

来源&#xff1a;经济参考报作者&#xff1a;班娟娟、钟源从坚持把科技自立自强作为国家发展的战略支撑&#xff0c;到加快建设科技强国&#xff0c;实现高水平科技自立自强&#xff1b;从加强原创性、引领性科技攻关&#xff0c;坚决打赢关键核心技术攻坚战&#xff0c;到强化…

图像加减运算

图像的加减运算 原创文章&#xff1a;转载请注明出处 ©️ Sylvan Ding 图像相加 图像相加常常被用来进行图片降噪处理。令 g(x,y)g(x,y)g(x,y) 是无噪声理想图像 f(x,y)f(x,y)f(x,y) 被高斯加性噪声 η(x,y)\eta (x,y)η(x,y) 污染后的图像&#xff0c;即 g(x,y)f(x,y)η…

随机森林是我最喜欢的模型

来源&#xff1a;机器之心TensorFlow 决策森林 (TF-DF) 现已开源&#xff0c;该库集成了众多 SOTA 算法&#xff0c;不需要输入特征&#xff0c;可以处理数值和分类特征&#xff0c;为开发者节省了大量时间。在人工智能发展史上&#xff0c;各类算法可谓层出不穷。近十几年来&a…

拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)

拉普拉斯锐化 [原理及Python实现]&#xff08;含拉氏标定、拉普拉斯标定&#xff09; 原创文章&#xff1b;转载请注明出处&#xff1a;©️ Sylvan Ding 锐化处理的主要目的是突出灰度的过度部分。图像锐化的用途多种多样&#xff0c;应用范围从电子印刷和医学成像到工业…

以太坊 方法签名

最近在工作中使用web3j调用合约&#xff0c;发现一个比较头疼的问题&#xff1f;复杂一点的合约参数多了&#xff0c;函数的方法签名老是出错。在这之前调用合约方法一直都是拼接合约的函数签名以及参数。为了能快速的获取每个合约的函数签名&#xff0c;我在思考是否便捷可行解…

训练 GPT-3,为什么原有的深度学习框架吃不消?

来源&#xff1a;AI前线作者&#xff1a;一流科技 CEO 袁进辉近年来&#xff0c;深度学习被广泛应用到各个领域&#xff0c;包括计算机视觉、语言理解、语音识别、广告推荐等。在这些不同领域中&#xff0c;一个共同的特点就是模型规模越来越大&#xff0c;比如 GPT-3 模型的参…

Canny边缘检测原理及其python实现

Canny边缘检测原理及其python实现 转载请注明出处&#xff1a;©️ Sylvan Ding Canny边缘检测算法 多数分割算法均基于灰度值的两个基本性质之一&#xff1a;不连续性和相似性。图像的边缘检测就是基于灰度的不连续性&#xff08;灰度突变&#xff09;来实现图像分割的。…

离奇的梦境,能够防范大脑过拟合

来源&#xff1a;混沌巡洋舰 1 )梦让我们对世界的理解不再那么简单化关于为什么大脑进化出夜间做梦&#xff1f;神经科学界提出了各种假说&#xff0c;诸如通过梦来调节情绪&#xff0c;巩固记忆&#xff0c;或梦可以帮助我们选择性的遗忘&#xff0c;对我们应对现实世界的问题…

RGB空间中的彩色图像分割原理及其python实现

RGB空间中的彩色图像分割 ⭐️ 为尊重原创性&#xff01;转载请注明出处&#xff1a;©️ Sylvan Ding’s Blog 概述 本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法&#xff0c;并用python实现了各个算法。之后将二者的优势结合&#xff0c;提出了改进后的曼哈顿…

路飞学城Python-Day171

Evernote Export 线性结构&#xff1a;python的列表操作列表是如何存储的&#xff1a;顺序存储的&#xff0c;是一块连续的内存&#xff0c;内存是一堆格子&#xff0c;列表是一串连续的编号32位机器上一个整数占4个字节数组和列表有2点不同&#xff0c;1.数组的元素类型要求是…

HarmonyOS 2面世!是没有退路还是时机成熟?中国操作系统崛起元年或已到来

来源&#xff1a;21Tech(News-21)作者&#xff1a;倪雨晴编辑&#xff1a;张星6月2日晚间&#xff0c;华为鸿蒙操作系统HarmonyOS迎来重要时刻&#xff0c;华为正式发布多款搭载HarmonyOS 2的新产品&#xff0c;包括HUAWEI Mate 40系列新版本、Mate X2新版本、HUAWEI WATCH 3系…

操作系统:线程同步

操作系统&#xff1a;线程同步 使用Linux无名信号量实现了读写者线程的互斥和同步。 实验环境 环境&#xff1a;Linux语言&#xff1a;CCMake&#xff1a;3.17.1GCC&#xff1a;7.5.0IDE&#xff1a;Clion 2020.3.1 实验目标 理解进程同步的两种制约关系&#xff1a;互斥与…

中国工程院2021年院士增选第二轮候选人名单公布

来源&#xff1a;先进制造业中国工程院2021年院士增选进入第二轮评审候选人名单&#xff08;按候选人姓名拼音排序&#xff09;未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城…

vsftpd部署流程和常见问题详解

vsftpd部署流程和常见问题详解 ⭐️ 网上关于在云服务器里配置vsftpd的文章鱼龙混杂&#xff0c;没有一篇是可以彻底解决问题的&#xff0c;有些问题虽简单&#xff0c;但也让初学者感到困惑。本文详细说明vsftpd的部署流程和一些常见问题的解决方法&#xff0c;详述用户创建过…

谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...

来源&#xff1a;Google AI Blog编辑&#xff1a;yaxin, LQ &#xff08;新智元&#xff09;突触&#xff0c;是神经网络的「桥梁」。我们知道&#xff0c;人类大脑有860亿个神经元&#xff0c;因为有了突触&#xff0c;才可以把神经元上的电信号传递到下一个神经元。长久以来&…

智慧食堂项目策划书(商业计划书/立项计划)

金鹰物联智慧食堂项目策划书&#xff08;商业计划书/立项计划&#xff09; ©️ 金鹰物联项目组&#xff0c;转载请注明出处&#xff01; ⭐️ 技术部分请参考博文&#xff1a;基于YOLOv5的中式快餐店菜品识别系统 文章目录金鹰物联智慧食堂项目策划书&#xff08;商业计划…

pipelineDB学习笔记-2. Stream (流)

一、流的定义&#xff1a; 所谓的“流”&#xff08;stream&#xff09;在pipelineDB中是指那些被允许的数据库客服端推送到 Continuous View&#xff08;连续视图&#xff09; 的时序化数据的一种“抽象”。流中的每一个raw(数据列)或者event(事件)&#xff0c;看起来是和普通…