【大话设计模式】—— 原型模式
一、概念
为了提高效率,我们经常会采用复制的方式,这样不用一点一点的从头开始进行(初始化新对象),直接利用结果就好(动态的获得对象运行时的状态)。
前几天我做演讲的ppt,就有偷懒之嫌~ 把大家的优秀博客,截图然后copy到ppt当中,这样免去了重新构思这一环节,高质量(大家的功劳 O(∩_∩)O~),高效率。
设计模式中也不乏类似功能的模式。原型模式便是其中之一。
原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。不需要知道任何创建的细节。
二、UML图
客户(Client)对象:使用原型对象的客户程序
抽象原型(Prototype)对象:声明了克隆自身,且具体原型对象必须实现的接口(如果是深复制,必须有实现clone的规定)。
具体类型(ConcretePrototype)对象:从抽象原型派生而来,是客户程序使用的对象,即被复制的对象。此角色需要实现抽象原型角色所要求的接口,实现一个克隆自身的操作。
三、实例解析
学习了设计模式之后,小M终于有了一份工作(满18了,木有非法使用童工。。)。为了获得更多推销自己的机会,她设计了一张自己的名片,包含的信息有:姓名 性别 年龄 电话。但是一张名片送人之后,就再也没有了,所以她通过原型模式又给自己copy了几张。
//客户端代码class Program{static void Main(string[] args){ConcreteBussinessCard bc = new ConcreteBussinessCard("小M");bc.SetPersonalInfo("女","18","12345678901");//克隆类ConcreteBussinessCard的对象bc就能得到新的实例bc1ConcreteBussinessCard bc1 = (ConcreteBussinessCard)bc.Clone();bc1.SetPersonalInfo("女", "18", "12345678901");bc.Display();bc1.Display();Console.Read();}}
//抽象名片类abstract class BussinessCard{//定义名片包含信息:姓名,性别,年龄,电话号码为私有变量private string name; private string sex;private string age; private string phoneNumber; //构造函数public BussinessCard(string name){this.name = name; }//设置个人信息public void SetPersonalInfo(string sex, string age,string phoneNumber){this.sex = sex;this.age = age;this.phoneNumber = phoneNumber;}//显示public void Display(){Console.WriteLine("姓名:{0} 性别:{1} 年龄:{2}",name ,sex ,age );Console.WriteLine(" 电话:{0}",phoneNumber );}//关键是这里有一个Clone方法public abstract BussinessCard Clone();}
//具体名片类class ConcreteBussinessCard : BussinessCard{public ConcreteBussinessCard(string name): base(name){ }public override BussinessCard Clone(){return (BussinessCard)this.MemberwiseClone();//创建当前的浅表副本。}}}
运行结果:
四、深复制和浅复制
背景:MemberwiseClone()方法是这样,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
五、总结
原型模式能够简化代码,优化设计,让我们摆脱了手工抄写的时代。代码同样可以推动社会进步!
Ps:对深复制和浅复制的理解还很浅,看了一些大牛的博客,也不是很明白,期待大家的点拨!
【大话设计模式】—— 原型模式相关推荐
- 大话设计模式—原型模式
原型模式(Prototype Pattern),用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象:即用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建 ...
- 大话设计模式-原型模式的浅复制与深复制
在看这个原型模式的时候,不知你是否有和博主一样的迷茫.诶,这里不是复制对象,怎么改属性并不是全部对象都改
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...
- 设计模式 原型模式_设计模式:原型
设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
最新文章
- csdn新版博客初体验
- 区分 UML 类图中的几种关系
- 3 命名空间与命名规范
- python只能对列表进行切片_Python3:类型错误:列表索引必须是整数或切片,而不是s...
- comsol固体传热_【 COMSOL 知识库】如何解决 COMSOL 软件“内存不足” 的问题
- 《C程序设计语言》(第二版)要点总结
- iis下php 500错误
- Flash MX 2004 中的文本遮罩
- 爬虫_抓取51job招聘数据
- asp.net中英文转换
- ROS1云课→22机器人轨迹跟踪
- java 吃豆豆游戏背景底纹_java swing开发简单的大鱼吃豆子小游戏,可用于毕业设计(附详细设计文档)...
- 室温金刚石共聚焦平台
- Java EE开发系列教程 - 使用EJB组件与JPA层交互
- 世界上最会“算计”的公司争相布局区块链,普华永道等四大会计师事务所的变革之路...
- 胃肠道微生物与癌症有关
- arcgis把jpg转成栅格图像_]在ArcGIS中配准(TIF、JPEG)栅格图像并矢量化(转)
- 英文文档翻译软件-汉语文章翻译成英语
- lamp 架构的搭建
- TCP 为什么需要三次握手?
热门文章
- 软件测试的艺术_全书读书笔记
- 内存泄露与内存溢出的区别及解决方法
- SMIT快捷命令总结
- 清华70%的高考状元去哪了
- 夺命追击(Murderous Pursuits)服务器搭建教程
- 关于 JavaScript 学习,一些好的博客或者网站
- element表格多列排序_vue表格树状结构的实现
- php对于5g云桌面前景,5G覆盖时代对云桌面发展的影响有哪些?
- [精品毕设]微信小程序的投票系统问卷调查+后台管理系统
- 计算机视觉三大会议论文,计算机视觉顶级会议CVPR2021 最新出炉的最佳paper,陆续更新中...(附论文地址)...