设计模式之原型模式prototype

1、原型模式的使用和本质、以及优势:


    a、通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式。

    b、原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。

    c、其优势有:效率高(直接克隆,避免了重新执行构造过程步骤)。

    d、克隆类似于 new, 但是不同于 new 。new 创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出来的新对象改变不会影响原型对象。(可以对克隆对象修改属性值)


2、原型模式的实现:

    - Clone 接口 和 clone 方法

    

    简单的代码演示:


    a、可以看到,在 Sheep 这个类中实现了 Cloneable 接口,并且覆盖了 父类 Object 的 clone() 方法。(这样就实现了浅克隆)


wKioL1kiqLyw6o1_AACNKIaJjvw675.png


    b、在 Client06 测试类中可以看到,克隆出来的 Sheep 对象和原来的 Sheep 对象是两个不同的对象,但是它们两的属性值相同。


wKioL1kiqbGxi_lYAAB9W8Lnm9U652.png


    c、上面提到了浅克隆的问题,现在看看在 Client06 测试类修改一些代码后的输出结果。


wKiom1kirEyAEL5cAACAF9pZuIc205.png

wKioL1kirhDgBQzrAABpGR0rWlQ986.jpg

  

    注:可以看到,在测试结果中, Sheep 类的 对象 s1 和 s2 是共同使用 Date 对象,所以当 Date 对象的值发生修改时,它们两个的 brithday 属性值也就发生修改。(浅克隆只对对象进行克隆,深克隆是将对象的属性值也进行克隆操作。)


     d、将 Sheep 类中的 clone 方法进行如下修改,就可以实现深克隆。


wKiom1kir4CyCGaSAAAptwW1YoA852.png


wKioL1kir4GTvyCnAAB98N51zHk497.png


3、使用序列化和反序列化实现深克隆:


wKiom1kisIDQC96mAACD2jnYBdc647.png

   

wKiom1kisIGxJxtHAAApr48hUB0595.png


    注:序列化和反序列化需要在在 Sheep 类中 实现 Serializable 接口。


4、开发中的应用场景:

    

    原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。

    - spring 中 bean 的创建实际上就是两种:单例模式和原型模式。(原型模式一般会和工厂模式搭配使用。)



    


    




来源:春哥技术博客,欢迎分享,转载请注明出处。(欢迎加春哥团队客服微信号:taike668)

本文地址:https://www.cgtblog.com/kafa/1933.html
上一篇:AngularJs初识      下一篇:用户登录注册之验证码技术实现