|兄弟,你确定不学会使用“原型设计模式”来创建类吗?
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
先赞再看 , 多好的习惯 。
今天跟大家分享一下设计模式中的“原型模式” 。
概述当系统中需要大量创建相同或者相似的对象时 , 就可以通过“原型设计模式”来实现 。 原型模式是“创建型设计模式”中的一种 。
原型模式的核心思想是 , 通过拷贝指定的“原型实例(对象)” , 创建跟该对象一样的新对象 。 简单理解就是“克隆指定对象” 。
这里提到的“原型实例(对象)” , 就是被克隆的对象 , 它的作用就是指定要创建的对象种类 。
需要拷贝的原型类必须实现\"java.lang.Cloneable\"接口 , 然后重写Object类中的clone方法 , 从而才可以实现类的拷贝 。
Cloneable是一个“标记接口” , 所谓的标记接口就是该接口中没有任何内容 。 标记接口的作用就是为了给所有实现了该接口的类赋予一种特殊的标识 。
只有当一个类实现了Cloneable接口后 , 该类才会被赋予调用重写自Object类的clone方法的权利 。 否则会抛出“CloneNotSupportedException”异常 。
浅拷贝和深拷贝原型模式中的拷贝对象可以分为:“浅拷贝”和“深拷贝” 。
浅拷贝:
1、当类的成员变量是基本数据类型时 , 浅拷贝会复制该属性的值赋值给新对象 。深拷贝:
2、当成员变量是引用数据类型时 , 浅拷贝复制的是引用数据类型的地址值 。 这种情况下 , 当拷贝出的某一个类修改了引用数据类型的成员变量后 , 会导致所有拷贝出的类都发生改变 。
深拷贝不仅会复制成员变量为基本数据类型的值 , 给新对象 。 还会给是引用数据类型的成员变量申请储存空间 , 并复制引用数据类型成员变量的对象 。 这样拷贝出的新对象就不怕修改了是引用数据类型的成员变量后 , 对其它拷贝出的对象造成影响了 。代码通过简单的文字描述可能大家对该模式的认知还是不够全面 , 下面让我们通过代码来深入了解一下 。
浅拷贝案例:一个人 , 名叫“小菜鸟” , 职业是“程序员” 。 现在因项目需求剧增 , 导致一个人无法按时完成任务 , 从而需要克隆出来属性与其一模一样的优秀程序员 。
原型类代码:
测试类:
执行结果:
深拷贝在Person类中添加一个是引用数据类型的成员属性Computer 。
Computer类:
原型类:
该类中列举了两种方式 , 重写clone方法时任选其一即可 , 推荐使用方式二 。
注意:以上两个类中实现Serializable接口是为了完成方式二中通过序列化来完成深拷贝 , 如果选择方式一可以不实现Serializable接口 。
测试类:
执行结果:
通过以上两种方式都可以实现类的深拷贝 , 并且我也已经测试过了 , 具体测试代码就不在此赘述了 , 有兴趣的读者可以自己试一下 , 就修改一下是引用数据类型的成员属性值和clone方法即可 。
总结
1、通过原型模式可以简化创建重量级对象的过程 , 并提高程序的效率 。今天的分享就到这里了 , 如果感觉“菜鸟”写的文章还不错 , 记得点赞加关注呦!你们的支持就是我坚持下去的动力 。 文章哪里写的有问题的也希望大家可以指出 , 我会虚心受教 。
2、原型设计模式是动态获取对象运行时的状态进行创建对象的 。
3、使用原型设计模式可以使代码变的更加灵活 , 因为当原型类发生变化(增、减属性)时 , 克隆的对象也会做出相应的改变 。
4、对已经创建好的类进行改造 , 使其支持克隆时需要修改源代码 , 这就是违背了ocp原则 。
【|兄弟,你确定不学会使用“原型设计模式”来创建类吗?】
推荐阅读
- 法定不起诉|广东肇庆通报交警队长儿子酒驾肇事案:梁某勇已被捕
- 思文程璐离婚真相曝光:把夫妻过成兄弟,是成人世界最大的谎言
- 大众轿跑SUV探岳X上市—探岳/GTE/R-line/X四孪生兄弟该如何选?
- 梅根·马克尔|威廉兄弟形同陌路,梅根不满凯特,在她怀孕时,凯特照顾不周!
- 做哑铃侧平举想抑制斜方肌发力?想多了吧兄弟,你根本就抑制不了
- 银河系|120亿光年外惊现银河系的“亲兄弟”
- 陈婷|以家人之名:兄弟二人九年才归,子秋另有原因,凌霄的理由太意外
- 约瑟夫·拜登|拜登竞选竟遭好兄弟反水?奥巴马:不要低估拜登搞砸一切的能力
- 和尚念经为什么要敲木鱼?肯定不是缘木求鱼
- |国际锐评丨聪明的外企一定不会离开中国