如何使用?
1.首先定义一个User类,它必须实现了Cloneable接口,重写了clone()方法。
public class User implements Cloneable { private String name; private int age; private Brother brother; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
2.Brother类
public class Brother{ private String name; }
3.应用演示类
public class PrototypeDemo { public static void main(String[] args) throws CloneNotSupportedException { User user1 = new User(); user1.setName("秋红叶"); user1.setAge(20); Brother brother1 = new Brother(); brother1.setName("七夜圣君"); user1.setBrother(brother1); // 我们从克隆对象user2中修改brother,看看是否会影响user1的brother User user2 = (User) user1.clone(); user2.setName("燕赤霞"); Brother brother2 = user2.getBrother(); brother2.setName("唐钰小宝"); System.out.println(user1); System.out.println(user2); System.out.println(user1.getBrother() == user2.getBrother()); } }
4.深拷贝写法
这是User类
public class User implements Cloneable { private String name; private int age; private Brother brother; /** * 主要就是看这个重写的方法,需要将brother也进行clone */ @Override protected Object clone() throws CloneNotSupportedException { User user = (User) super.clone(); user.brother = (Brother) this.brother.clone(); return user; } }
这是Brother类
public class Brother implements Cloneable{ private String name; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
这里是结果演示
public class PrototypeDemo { public static void main(String[] args) throws CloneNotSupportedException { User user1 = new User(); user1.setName("秋红叶"); user1.setAge(20); Brother brother1 = new Brother(); brother1.setName("七夜圣君"); user1.setBrother(brother1); // 我们从克隆对象user2中修改brother,看看是否会影响user1的brother User user2 = (User) user1.clone(); user2.setName("燕赤霞"); Brother brother2 = user2.getBrother(); brother2.setName("唐钰小宝"); System.out.println(user1); System.out.println(user2); System.out.println(user1.getBrother() == user2.getBrother()); } }
可以看到,user1的brother没有受到user2的影响,深拷贝成功!
5.图解深拷贝与浅拷贝
总结与思考
java中object类的clone()方法为浅拷贝必须实现Cloneable接口如果想要实现深拷贝,则需要重写clone()方法
到此这篇关于浅谈Java设计模式之原型模式知识总结的文章就介绍到这了,更多相关Java原型模式内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!
- 本文固定链接: https://www.zxbcw.cn/post/213268/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)