原型模式

定义:

用原型实例制定创建对象的种类,并通过拷贝这些原型。创建新的对象。

实质:

就是从一个对象在创建还有一个可定制的对象。并且不须要知道不论什么创建的细节。

核心:

(1)、实现Cloneable接口,能够使用此接口的类上使用clone方法。

(2)、重写Object类中的clone方法,由于全部类的父类是Object类。Object有一个clone方法。作用是返回对象的一个拷贝。可是其作用域protected类型的,一般的类无法调用,因此,将clone改为public类型。

结构图:

代码实现:

    class Resume : ICloneable//实现ICloneable接口{private string name;private string computer;public Resume(string name){this.name = name;}public void SetWordExperience(string computer){this.computer = computer;}public void Display(){Console.WriteLine("{0}", name);Console.WriteLine("工作经历: {0}", computer);}public Object Clone()//重写Clone方法,改为public类型{return (Object)this.MemberwiseClone();}}

client代码:

    class Program{static void Main(string[] args){Resume a = new Resume("大鸟");a.SetWordExperience("XX大公司");a.Display();for (int i = 0; i < 3; i++)//没有别的意思,仅仅是用用{Resume _i = (Resume)a.Clone();_i.SetWordExperience("YY大公司");_i.Display();}Console.Read();}}

这就是简单复制。一般在初始化的信息不发生变化的情况下,科隆市最好的办法,这既隐藏了对象创建的细节,有对性能是大大的提高。

使用原型模式创建对象比直接new一个对象在性能上要好的多。由于Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的区别很明显。

Object类的clone方法仅仅会拷贝对象中的主要的数据类型。对于数组、容器对象、引用对象等都不会拷贝。这就是浅拷贝。假设要实现深拷贝。必须将原型模式中的数组、容器对象、引用对象等另行拷贝。

浅复制和深复制

这里指谈谈引用对象的深复制:

须要解决的代码:

    class WrokExperience//新增加一个类{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}}class Resume : ICloneable{private string name;private string computer;private WrokExperience work;//引用类public Resume(string name){this.name = name;work = new WrokExperience();}public void SetWorkExperience(string computer, string workDate){this.computer = computer;work.WorkDate = workDate;}public void Display(){Console.WriteLine("{0}", name);Console.WriteLine("工作经历: {0} {1}", work.WorkDate, computer);//这里的WorkDate ,须要的是每一次赋值的。

} public object Clone() { return (Object)this.MemberwiseClone(); } } class Program { static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetWorkExperience("1998-2008", "XX大公司"); Resume _i = (Resume)a.Clone(); _i.SetWorkExperience("1997-2008", "YY大公司"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("1996-2008", "ZZ大公司"); a.Display(); _i.Display(); b.Display(); Console.Read(); } }

执行结果:

而实际上,我们须要的是不一样的。

改动代码:

    class WorkExperience : ICloneable//对于引用类相同的拷贝{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}public Object Clone(){return (Object)this.MemberwiseClone();}}class Resume : ICloneable{private WorkExperience work;private string name;private string computer;public Resume(string name){this.name = name;work = new WorkExperience();}private Resume(WorkExperience work)//做了一个私有的构造方法。让它克隆完毕,然后再给这个”简历“对象的响应字段赋值,终于返回一个深复制的简历对象{this.work = (WorkExperience)work.Clone();}public void SetExperience(string workDate, string computer){work.WorkDate = workDate;this.computer = computer;}public void Display(){Console.WriteLine("{0}", name);Console.WriteLine("工作经历: {0} {1}", work.WorkDate, computer);}public Object Clone(){Resume obj = new Resume(this.work);obj.name = this.name;obj.computer = computer;return obj;}}

client代码不变。

执行结果:

得到预期结果。

事实上,我们使用原型模式,简单的说我们就是简化对象的创建。

转载于:https://www.cnblogs.com/claireyuancy/p/6791632.html

大话设计模式之原型模式相关推荐

  1. 【大话设计模式】—— 原型模式

    一.概念 为了提高效率,我们经常会采用复制的方式,这样不用一点一点的从头开始进行(初始化新对象),直接利用结果就好(动态的获得对象运行时的状态). 前几天我做演讲的ppt,就有偷懒之嫌- 把大家的优秀 ...

  2. 《大话设计模式》原型模式

    原型模式(Prototype), 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.[DP] 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 原型模式 ...

  3. 【GOF23设计模式】原型模式

    [GOF23设计模式]原型模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 1 pa ...

  4. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  5. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  6. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  7. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  8. 设计模式回顾——原型模式(C++)

    文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...

  9. 设计模式之 原型模式

    原型模式应用场景举例:  GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...

最新文章

  1. ASP.NET中绑定枚举类型
  2. 踏上云旅程 存储准备好了吗
  3. 菜鸟解读qt源码----qsqlfield.h
  4. java中调用kettle作业以及生成web service 接口
  5. [APIO2010]特别行动队
  6. 赛道二周冠分享:石头哥有些心里话要说一说
  7. JavaScript学习(五十五)—组合继承
  8. 浏览器相关功能系统调用
  9. 通过银行卡号获取银行名称
  10. Redis进阶: 锁的使用
  11. 【论文笔记】Semantic Parsing on Freebase from Question-Answer Pairs
  12. jquery按钮加载动画插件loda-button
  13. 一组Android机器人素材图片
  14. 微信支付 postman_小刘同学微信支付接入全笔记
  15. Android中的阿里云仓库
  16. 使用Mosquitto软件测试mqtt功能
  17. 关于屏幕尺寸引起的问题
  18. ip反查域名脚本实现
  19. 网络攻击测试软件,局域网攻击软件如何检测
  20. LKY-简单手拉手会议扩声方案

热门文章

  1. 反编译工具Reflector ILSpy
  2. PAT1046. 划拳
  3. 《流畅的python》之 设计模式, 装饰器
  4. 问题 K: Sequence Problem (III) : Array Practice
  5. python语言的开发者_写给.NET开发者的Python教程(一):引言
  6. Python练习题:3 猜数游戏
  7. android开发 转跳功能,如何在Android中利用Intent实现一个页面跳转功能
  8. mysql sql语句 datediff_SQL语句中DateDiff函数说明
  9. 链上结构化产品Ribbon将推出基于看跌期权的资管产品Puts Theta Vault
  10. SAP License:瞎搞!你真的懂什么是ERP、中台和低代码吗?