设计模式7之原型模式

如果你在开发中遇到需要创建大量的对象 , 你可以使用传统的构造函数创建对象 。 但是对于开发来说这样做太麻烦了 , 有没有高效的生成对象的方式呢?
当然是有的 , 原型模式就能解决上面的问题 。
什么是原型模式“
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类 , 并且通过拷贝这些原型创建新的对象 。 )

如果已经创建好一个对象 , 我们可以通过复制的方式来创建一个新的对象 。 这就是原型模式 , 使用原型模式创建对象 , 我们无需知道创建细节 。 实际这种方式是非常高效的 。
我们举个栗子:大家都在Windows上面都安装过JDK吧 , 我们安装时需要点击很多下一步 。 这中间可能还要选取安装的路径 , 选择安装的模块 。 如果我们在Linux上面安装JDK , 只需要将JDK安装文件复制到Linux上 , 解压即可用 。 你看在Windows上安装文件比在Linux上安装复杂多了吧 。
原型模式的关键在于复制 , 复制的目的就是为了简化对象创建流程 , 提高效率 。
原型模式的结构主要包含几个要素:
“抽象原型类:定义需要实现的接口具体原型类:实现抽象原型类的clone()方法访问类:调用clone()方法复制出来的对象”
设计模式7之原型模式文章插图
原型模式
要注意 , 这里的clone()方法是浅拷贝 。
设计模式7之原型模式文章插图
结果如下:
设计模式7之原型模式文章插图
关于浅拷贝与深拷贝我查了维基百科 , 有兴趣的可以去看看原文:


这里我翻译了:
浅拷贝“
复制对象的一种方法是浅层复制 。 在这种情况下 , 创建一个新的对象B , 将A的字段值复制到B上 , 这也被称为逐字段复制 , 字段换字段复制 , 或字段拷贝 , 如果字段值是一个对象的引用(如内存地址) , 它就会复制引用 , 从而与A引用相同的对象 , 如果字段值是一个基元类型 , 它就会复制基元类型的值 。 在没有基元类型的语言中(在这种语言中 , 所有的东西都是对象) , 复制B的所有字段都是引用与原A的字段相同的对象 , 因此引用的对象是共享的 , 因此如果其中一个对象被修改(来自A或B) , 则在另一个对象中可以看到变化 。 浅层拷贝很简单 , 通常也很便宜 , 因为它们通常可以通过简单地精确复制位来实现 。

我总结下 , 浅拷贝中如果原对象里面的属性是基本类型 , 会将值拷贝到新对象 , 如果是引用类类型 , 会使用同一个引用 。
深拷贝“
另一种方法是深度拷贝 , 这意味着字段被取消引用:不是对被拷贝对象的引用 , 而是为任何被引用的对象创建新的拷贝对象 , 并将对这些对象的引用放在 B 中 。 结果与浅层拷贝的结果不同 , 因为拷贝 B 所引用的对象与 A 所引用的对象不同 , 而且是独立的 。 由于需要创建额外的对象 , 深层拷贝的成本较高 , 而且由于引用可能会形成一个复杂的图形 , 因此深层拷贝可能会更加复杂 。
深度复制是指复制过程递归发生的过程 。 它意味着首先构造一个新的集合对象 , 然后用在原始对象中找到的子对象的副本递归地填充它 。 在深度复制的情况下 , 对象的副本被复制到其他对象中 。 这意味着对对象副本的任何更改都不会反映在原始对象中 。 在 python 中 , 这个功能是通过 "deepcopy() "函数实现的 。

总的来说 , 深度拷贝就是创建了新的引用 。
代码展示RealizeType
设计模式7之原型模式文章插图


推荐阅读