《Java设计模式及实践》—2.4 原型模式

举报
华章计算机 发表于 2019/07/22 13:04:00 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第2章,第2.4节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

2.4 原型模式

原型模式看似复杂,实际上它只是一种克隆对象的方法。现在实例化对象操作并不特别耗费性能,那么为什么还需要对象克隆呢?在以下几种情况下,确实需要克隆那些已经经过实例化的对象:

  • 依赖于外部资源或硬件密集型操作进行新对象的创建的情况。

  • 获取相同对象在相同状态的拷贝而无须进行重复获取状态操作的情况。

  • 在不确定所属具体类时需要对象的实例的情况。

请看如图2-8所示的类图。

 image.png

图 2-8

在原型模式中,主要涉及以下类:

  • Prototype(抽象原型类):声明了clone()方法的接口或基类,其中clone()方法必须由派生对象实现。在简单的场景中,并不需要这种基类,只需要直接具体类就足够了。

  • ConcretePrototype(具体原型类):用于实现或扩展clone()方法的类。clone()方法必须要实现,因为它返回了类型的新实例。如果只在基类中实现了clone()方法,却没有在具体原型类中实现,那么当我们在具体原型类的对象上调用该方法时,会返回一个基类的抽象原型对象。

可以在接口中声明clone()方法,因而必须在类的实现过程中实现clone()方法,这项操作会在编译阶段强制执行。但是,在多继承层次结构中,如果父类实现了clone()

方法,继承自它的子类将不会强制执行clone()方法。

浅拷贝和深拷贝

拷贝对象时,我们应该清楚拷贝的深度。当拷贝的对象只包含简单数据类型(如int和float)或不可变的对象(如字符串)时,就直接将这些字段复制到新对象中。但当拷贝对象中包含对其他对象的引用时,这样就会出现问题。例如,如果为具有引擎和四个轮子的Car类实现拷贝方法时,我们不仅要创建一个新的Car对象,还要创建一个新的Engine对象和四个新的Wheel对象。毕竟两辆车不能共用相同的发动机和车轮,这称为深拷贝。

浅拷贝是一种仅将本对象作为拷贝内容的方法。例如,如果我们要为Student对象实现拷贝方法,就不会拷贝它所指向的Course对象,因为多个Student对象会指向同一个Course对象。

在实践中,我们应根据具体情况来决定使用深拷贝、浅拷贝或混合拷贝。通常,浅拷贝对应于聚合关系,而深拷贝则对应于组合关系。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200