引言:

原型,感觉就是拷贝,只是给拷贝分了深拷贝和浅拷贝。

理解:

在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设计模式_原型模式相关推荐

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

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

  2. 设计模式之 原型模式

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

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

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

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

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

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

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

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

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

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

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

  8. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  9. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

最新文章

  1. ubuntu14.04安装hadoop2.6.0(伪分布模式)
  2. BH38-Z06单精度绝对值旋转编码器数据手册
  3. 卷机神经网络的可视化(可视化中间激活)
  4. linux实验报告用户管理,Linux实验报告-用命令实现用户和组的管理
  5. git合并分支的时候将某个文件添加到忽略列表_常用的 Git 命令
  6. 查看嵌入式设备的CPU频率
  7. 关于Mysql服务自动关闭以及无法启动问题的解决办法
  8. python自学行吗-有编程基础Python自学行吗?
  9. leetcode笔记:Majority Element
  10. 阿里云Linux服务器配置Java环境
  11. python实现大学物理实验不确定度计算
  12. 核心银行系统 之一 历史与发展
  13. linux系统Nginx下limit_req模块burst参数超详细解析
  14. flutter 仿微信展开收起两种写法
  15. 解决:vue项目中页面顶部和左边出现空白
  16. Python遍历目录下的文件(os.walk 、os.listdir的用法)
  17. 2021年最新最全面的Java视频教程!!!
  18. Flowerpot(又是尺取。。)
  19. 小猫爪:汽车电子小知识02- ISO14229-1(UDS)简介
  20. 苹果Mac在一段时间不使用后,应用(系统)会自动退出(重启)的解决方法

热门文章

  1. 偶然的一次渗透从弱口令->docker逃逸
  2. 最全的http头部信息分析(转载)
  3. node:http协议、sql、接口
  4. win10+anaconda3安装tensorflow-gpu和pytorch-gpu版
  5. HBase 1.x Coprocessor使用指南
  6. fetch获取解析json数据
  7. geometry-api-java 学习笔记(三)多点 multipoint
  8. 快速搞懂ThreadLocal实现原理
  9. MySQL中述职类型的长度问题
  10. Hbase总结(十)Hhase性能调优