原型模式
序言:今天我们来聊一下原型模式,我个人认为原型模式的命名不太好理解,称呼其为克隆模式会更妥当一点。原型模式的目的是通过复制一个现有的对象来生成一个新的对象,而不是通过实例化的方法。
1|0原型模式的基本介绍
-
用已经创建的实例对象作为原型,通过复制对象来创建一个和原型相同的对象或相似的新对象
-
原型模式属于创建型模式,主要通过
Cloneable
接口去完成 对象的复制
在原型模式结构图中,会有这么几个角色
- 抽象原型角色(Prototype):是声明克隆方法的接口,是所有原型类的公共父类
- 具体原型角色(Realizetype):它实现在抽象原型类中所声明的克隆方法,在克隆方法中返回一个克隆对象
- 访问角色(PrototypeTest): 使用具体原型类中的 clone() 方法来复制新的对象
需要注意的点:
在 Java 中 能够克隆的 Java类 务必得 实现 Cloneable
接口,表示这个 类 能够被 “复制”,至于这个 复制的效果 则与我们的实现有关,通常 clone()方法满足以下的条件:
- 对任何的对象x,都有:x.clone()!=x 。换言之,克隆对象与元对象不是一个对象
- 对任何的对象x,都有:x.clone().getClass==x.getClass(),换言之,克隆对象与元对象的类型一样
- 对任何的对象x,如果 equals() 方法编写得当的话, 那么x.clone().equals(x)应该是成立的
在正式开始原型模式之前,我们先了解两个概念 浅克隆和深克隆,浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制
2|0原型模式(浅克隆)
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址 复制 一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向 相同 的内存地址
下面我们以 花园和花 为案例
假设我们有一个花园,我们在花园里种植上好的牡丹花,有一天突然想照着牡丹园再建一个一模一样的园子,只是在花园中改种玫瑰
下面来测试一下原型模式(浅克隆)
我们发现,我们想在新开拓的花园中改种玫瑰后,会影响原花园的花卉的品种,这显然不是我们想要的效果
从这里我们也看出来了,浅克隆 在克隆一个对象的 引用类型的成员变量时 只是复制其地址值,并没有复制该对象
3|0原型模式(深克隆)
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
在 Java 中想实现 深克隆,通常有 两种方式
- 对于克隆对象的 引用类型,逐层克隆
- 使用序列化方式
3|1逐层克隆
逐层克隆意味着,如果我们要拷贝一个对象,该对象中 若有多个引用类型的成员变量,它们都要实现克隆方法,若嵌套多层引用类型的成员变量,则逐层 实现 Cloneable
接口
下面我们测试一下,使用逐层实现 Cloneable
接口 而完成的深克隆
3|2序列化
深克隆模式,采取序列化这种方式可能更简单一些,所以的引用类型 成员变量,都实现序列化接口,原型对象 自实现 deepClone
方法即可
下面我们进行序列化深克隆的测试
从上述我们可以看出,深克隆不仅在堆内存上开辟了空间以存储复制出的对象,甚至连对象中的引用类型的属性所指向的对象也得以复制,重新开辟了堆空间存储。
__EOF__

本文链接:https://www.cnblogs.com/dwlovelife/p/13311211.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-07-15 稀疏数组和队列