设计模式-原型模式

原型模式其实就是为了快速地创造相同的对象。举个栗子,工厂生产手机,那么这个时候,手机除去id其他部分基本相同,但是手机有很多属性要填写呢,那么我们可以选择生产时,就一个个new,然后通过一系列的set()方法放入属性,如此往复。但是这样做很复杂,因为手机其实都是一样的,那么我们就可以选择“克隆”的方式来创建对象。这样做有几个好处:

(1)如果创造对象的过程比较复杂,并且对象变化不大,那么我们可以通过克隆的方式,方便我们创建对象。

(2)clone()方法是native方法,速度比直接new 一个对象快。

如何实现原型模式喃?

只需要让你的类实现Cloneable接口,使其支持克隆,并且重写clone()方法即可。如下代码。

为了提高代码复用性,以及拓展性。假设每个对象都需要实现cloneable接口的话,那么每个类就需要重写clone()方法。那么我们可以提供一个公共父类Prototype,其实现了cloneable接口。重写了通用的clone()方法。而其他类只需要继承Prototype就可以了。

设计模式-原型模式


设计模式-原型模式


这就能够让手机原型能够被克隆了。

设计模式-原型模式

p2就是p通过克隆形成的对象。最后的输出结果如下

设计模式-原型模式

这样是不是方便了很多,快速地创建出了,你想要的差不多的对象。并且也验证了clone()并不是通过构造方法形成对象的。

但是上面仍然存在一个问题。对于基本数据类型来说,通过clone()方法得到的p2,和上面的p是相同的。但是ArrayList喃。

那么我们通过System.out.println(p2.getList() == p.getList());这行代码,

答案会是什么喃?两个welcomes是指向相同的对象吗?

得到的答案是true。那么我们期望的结果是什么喃?我觉得应该是不同的对象,这样才能保证数据是储存在自己手机里面的嘛。

而形成这个现象的原因是java的深浅拷贝形成的。现在我们还只是进行了浅拷贝:基本数据类型直接拷贝过来,引用变量将地址拷贝过来。那么深拷贝是什么喃?深拷贝:就是通过引用变量的clone()方法也形成一个新的对象。实现也比较简单,需要在phonePrototype类里重写clone()方法。

设计模式-原型模式

那么这个时候得到的结果则是false了,也就代表了引用对象也被克隆了。深拷贝也有一定的不便,比如在clone()方法里你需要自行修改。复杂了克隆的过程。(可能嵌套多层深拷贝,这样的话,那么可读性就降低了)