首先声明, 本篇blog的内容是参考Design pattern FAQ Part 1 (Training)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步.
设计模式有很多, 那么我们就从一个比较简单的模式开始-Prototype Pattern, 如果翻译成”原型模式”不知道对不对? 反正下面我们就这么叫吧.
原型模式是生成式模式(Creational Pattern)的一种, 这种模式提供的功能是从一个已有的实例中创建一个新的对象, 也就是拷贝啦. 但是我们希望的是对新对象任何的修改都不会影响原来的对象, 也就是我们理解的深拷贝咯.
在很多语言中, 使用一个对象对另一个对象赋值, 常常是把原来对象的引用赋值给了新的对象变量. 原博客中说的C#就是这样, 其实在python中, 对象的赋值, 使用的也是引用. 在C++中的话, 如果是指针进行赋值, 显然只是把一个指针的值赋给了另一个指针变量. 而如果是对象的话, 默认不重写赋值运算符操作, 则仅仅是浅拷贝; 如果需要深拷贝, 则需要重写赋值运算符操作.
原博客中举了一个C#的例子说明ByRef的拷贝方式, 截图如下:
这段代码很简单, 看看就明白了.
在很多情况下, 我们希望对新拷贝的对象的修改, 不影响原来的对象. 因此我们就要用到原型模式了.
下面我们来看看如何使用C#实现原型模式. 下面截图所示的代码片段展示的是我们希望对类’ClsCustomer’进行拷贝, 在C#中我们可以使用’MemberWiseClone’方法, 在Java中有’Clone’实现了同样的功能. 在下面的代码片段中, 我们同样展示了Client端如何进行深拷贝. 客户端代码中, 我们创建了两个对象分别是’obj1’和’obj2’, 对’obj2’的任何修改都不影响’obj1’, 这就是我们希望达到的目的, 也是原型模式需要提供的功能.
在原型模式中有两种类型, 本别是浅拷贝和深拷贝. 在浅拷贝中, 仅仅是当前对象被拷贝, 在该对象中的其他对象并没有被拷贝(其实就像上一部分说的仅仅是ByRef的赋值). 下面的代码片段展示的是Deep Copy, 在’ClsCustomer’中包含了一个’ClsAddress’类的对象, ‘Customer’的’MemberwiseClone’仅仅是拷贝’ClsCustomer’, 而没有拷贝’ClsAddress’的对象, 因此我们需要在’ClsAddress’对象中添加’MemberwiseClone’方法. 我们都在’getClone’方法中调用’MemberwiseClone’方法拷贝对象, 这样一个对象并且其内部包含的对象也被拷贝, 就是深拷贝; 如果仅仅是拷贝当前对象, 而其内部包含的对象并没有被拷贝, 则认为是浅拷贝. 这个概念在其他语言中也是通用的.
分享编程、算法、机器学习、数据挖掘、推荐系统、大数据计算框架等知识,欢迎扫码关注。
原文地址:http://blog.csdn.net/geniusluzh/article/details/45747251