1、原型模式的使用和本质、以及优势:
a、通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式。
b、原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。
c、其优势有:效率高(直接克隆,避免了重新执行构造过程步骤)。
d、克隆类似于 new, 但是不同于 new 。new 创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出来的新对象改变不会影响原型对象。(可以对克隆对象修改属性值)
2、原型模式的实现:
- Clone 接口 和 clone 方法
简单的代码演示:
a、可以看到,在 Sheep 这个类中实现了 Cloneable 接口,并且覆盖了 父类 Object 的 clone() 方法。(这样就实现了浅克隆)
b、在 Client06 测试类中可以看到,克隆出来的 Sheep 对象和原来的 Sheep 对象是两个不同的对象,但是它们两的属性值相同。
c、上面提到了浅克隆的问题,现在看看在 Client06 测试类修改一些代码后的输出结果。
注:可以看到,在测试结果中, Sheep 类的 对象 s1 和 s2 是共同使用 Date 对象,所以当 Date 对象的值发生修改时,它们两个的 brithday 属性值也就发生修改。(浅克隆只对对象进行克隆,深克隆是将对象的属性值也进行克隆操作。)
d、将 Sheep 类中的 clone 方法进行如下修改,就可以实现深克隆。
3、使用序列化和反序列化实现深克隆:
注:序列化和反序列化需要在在 Sheep 类中 实现 Serializable 接口。
4、开发中的应用场景:
原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。
- spring 中 bean 的创建实际上就是两种:单例模式和原型模式。(原型模式一般会和工厂模式搭配使用。)