原型模式
该设计模式主要用于对象的复制
此设计模式有多种实现:
- jdk内置cloneable接口
- 自定义接口
jdk内置cloneable接口
我们都知道object中有一个protected方法,叫clone,可以看到这是一个native方法(即该方法是由C++编写的,具体实现是根据操作系统而定)
1 |
|
我们来自己重写一个这个方法试一试
1 | public class Video { |
主程序
1 | public static void main(String[] args) throws CloneNotSupportedException { |
控制台输出
1 | Video{name='视频一号', gmtCreated=Fri Feb 25 10:31:04 CST 2022} |
可以发现,报错了,这是怎么回事,我不是已经重写了方法吗?
其实原因就是该类没有一个标记接口Cloneable
1 | /** |
将video实现该接口后,启动程序,控制台输出
1 | Video{name='视频一号', gmtCreated=Fri Feb 25 10:37:07 CST 2022} |
我们可以惊奇的发现,
两者的内容打印出来一模一样,两者的对象主体的hashcode是不同的,说明video和clone是货真价实的两个对象。
但是我们也发现他们的gmtCreated变量的hashcode是一样的,这说明两者指向的是同一个gmtCreated,有时候我们会有这样的需求,有时候我们不需要将复制后的对象内部指向的对象还是原来的那个对象,这时候我们就要修改clone方法
1 |
|
自定义接口
1 | public interface Copyable { |
具体实现就不写啦,本质是一样的。