.Net设计模式_原型模式
引言:
原型,感觉就是拷贝,只是给拷贝分了深拷贝和浅拷贝。
理解:
在C#.Net里面,我们可以很容易的通过Clone()方法实现原型模式。
任何类,只要想支持克隆,必须实现C#中的ICloneable接口。
ICloneable接口中有一Clone方法,可以在类中复写实现自定义的克隆方法。
克隆的实现方法有两种:浅拷贝(shallow copy)与深拷贝(deep copy)。
说明:浅拷贝是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝。而深拷贝是对对象实例中字段引用的对象也进行拷贝的一种方式。
UML图:(出之http://www.cnblogs.com/zhenyulu/articles/39257.html)
示例代码:
public interface IObjectOne {IObjectOne Clone();void Write(); } // Object public class Object1 : IObjectOne {public String _val = "A";public User _user = new User();public IObjectOne Clone(){_user.Name = "A name";return (IObjectOne)this.MemberwiseClone();}public void Write(){Console.WriteLine(_user.Name);Console.WriteLine("Object " + _val);} } // 实体 public class User {public String Name { get; set; } }
调用
static void Main(string[] args) {Object1 obj = new Object1();Object1 objCopy = (Object1)obj.Clone();// 值类型objCopy._val = "AA";// 引用类型objCopy._user.Name = "AA name";objCopy.Write();obj.Write();Console.ReadKey(); }
结果
从结果我们看出,MemberwiseClone方法是浅拷贝,因为只有值类型的被拷贝了,引用类型的没有被拷贝。
理解拷贝:
public interface IObjectTwo {// 浅拷贝 IObjectTwo Clone();// 深拷贝 IObjectTwo DeepClone(String name);// 输出void Write(); }public class Object3 : IObjectTwo {public String _val = "A";public User _user = new User();public Object3(){_user.Name = "A name";}// 浅拷贝public IObjectTwo Clone(){return (IObjectTwo)this.MemberwiseClone();}// 深拷贝public IObjectTwo DeepClone(String name){Object3 nowObj = new Object3();User obj = new User();obj.Name = name;nowObj._val = this._val;nowObj._user = obj;return (IObjectTwo)nowObj;}// 输出public void Write(){Console.WriteLine(_user.Name);Console.WriteLine("Object " + _val);} }
static void Main(string[] args) {Object1 obj = new Object1();Object1 objCopy = (Object1)obj.Clone();// 值类型objCopy._val = "AA";// 引用类型objCopy._user.Name = "AA name";objCopy.Write();obj.Write();Console.WriteLine();Console.WriteLine("--------------------");Console.WriteLine();Object3 nowObj = new Object3();Object3 objCopy2 = (Object3)nowObj.Clone();objCopy2._val = "XX";objCopy2._user.Name = "XX name";objCopy2.Write();// 深拷贝Object3 objCopy3 = (Object3)nowObj.DeepClone("My Name");objCopy3._val = "YY";objCopy3.Write();objCopy3._user.Name = "Test";objCopy3.Write();nowObj.Write();Console.ReadKey(); } }
结果:
从结果知道,拷贝一个引用类型,一定是New这个对象。这个其实跟堆栈有关,当new一个对象时,会在堆上面新分配一个区域,用于新对象的存储。
但是给一个引用对象赋值另一个引用对象时,是把引用的指针给了对象,并没有重新分配存储区域,所以修改这个对象就会影响,整个上下文中的这个对象,
因为,修改的是一个存储区域。
总结:(出之http://www.cnblogs.com/zhenyulu/articles/39257.html)
1、Prototype模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批类内部具有的,因此增加新产品对整个结构没有影响。
2、Prototype模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而Prototype模式就不需要这样。
3、Portotype模式具有给一个应用软件动态加载新功能的能力。由于Prototype的独立性较高,可以很容易动态加载新功能而不影响老系统。
4、产品类不需要非得有任何事先确定的等级结构,因为Prototype模式适用于任何的等级结构。
应用场景:
如:一个方法,里面的参数是一个实体类,ProcessMessage(User userInfo),而调用这个方法的方法是ReturnProcess()
public void ReturnProcess(){
User userInfo = new User();
// 调用前
......
ProcessMessage(userInfo);
//调用后
......
}
那么,在ProcessMessage修改对象uerInfo,会直接影响到 调用后,userInfo的值。
所以在一些设计中需要考虑子方法中修改对象带来的影响,
所以我们需要深拷贝和浅拷贝。
也就是我们说的原型模式。
代码下载:
百度网盘 http://pan.baidu.com/s/1c0iSVlu
CSDN http://download.csdn.net/detail/hater22/6847203
转载于:https://www.cnblogs.com/kimi-gyj/p/3517154.html
.Net设计模式_原型模式相关推荐
- 【GOF23设计模式】原型模式
[GOF23设计模式]原型模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口 浅复制 1 pa ...
- 设计模式之 原型模式
原型模式应用场景举例: GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
- 教你如何一篇博客读懂设计模式之—--原型模式
教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...
- 二十三种设计模式之原型模式
今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 设计模式回顾——原型模式(C++)
文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...
- java 肌汉模式_设计模式之原型模式详解(附源代码)
原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...
最新文章
- ubuntu14.04安装hadoop2.6.0(伪分布模式)
- BH38-Z06单精度绝对值旋转编码器数据手册
- 卷机神经网络的可视化(可视化中间激活)
- linux实验报告用户管理,Linux实验报告-用命令实现用户和组的管理
- git合并分支的时候将某个文件添加到忽略列表_常用的 Git 命令
- 查看嵌入式设备的CPU频率
- 关于Mysql服务自动关闭以及无法启动问题的解决办法
- python自学行吗-有编程基础Python自学行吗?
- leetcode笔记:Majority Element
- 阿里云Linux服务器配置Java环境
- python实现大学物理实验不确定度计算
- 核心银行系统 之一 历史与发展
- linux系统Nginx下limit_req模块burst参数超详细解析
- flutter 仿微信展开收起两种写法
- 解决:vue项目中页面顶部和左边出现空白
- Python遍历目录下的文件(os.walk 、os.listdir的用法)
- 2021年最新最全面的Java视频教程!!!
- Flowerpot(又是尺取。。)
- 小猫爪:汽车电子小知识02- ISO14229-1(UDS)简介
- 苹果Mac在一段时间不使用后,应用(系统)会自动退出(重启)的解决方法