java设计模式-克隆模式(复制模式)
来源:互联网 发布:防范sql注入攻击的方法 编辑:程序博客网 时间:2024/06/10 16:41
java中有深克隆和浅克隆的说法,clone方法在Object类中,该方法被protect修饰,我们无法直接调用,只能实现Cloneable接口,重写clone方法,我们举个作家和书本的栗子说明
首先解释深克隆,创建作家类
public class Person implements Cloneable{ private String name; private String gender; private int age; public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void display(){ System.out.println("姓名:"+this.name+"性别:"+this.gender+"年龄:"+this.age); } public Object clone(){ Person p = null; try { p = (Person)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } @Override public String toString() { return "name=" + name + ", gender=" + gender + ", age=" + age ; }}
然后创建书籍类
ublic class BookForDeep implements Cloneable { private String bookName; private double price; private Person author; public BookForDeep(String bookName, double price, Person author) { this.bookName = bookName; this.price = price; this.author = author; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Person getAuthor() { return author; } public void setAuthor(Person author) { this.author = author; } public void display() { System.out.println("书名:" + bookName + " 价格: " + price + "作者:" + author); } public String toString() { return "bookName: " + bookName + "price: " + price + "author:" + author; } public Object clone() throws CloneNotSupportedException { BookForDeep bfp = null; bfp = (BookForDeep) super.clone(); bfp.setAuthor((Person) super.clone()); return bfp; }}
我们写一个测试类
public class TestBookForDeepClone { public static void main(String[] args) { BookForDeep bfd1 = new BookForDeep("Hadoop权威指南", 0.01, new Person("xiaoli", "female", 23)); BookForDeep bfd2 = new BookForDeep("spark高级详解", 0.01, new Person("azhong", "male", 24)); System.out.println(bfd1.getAuthor() == bfd2.getAuthor()); bfd1.display(); bfd2.display(); }}
测试结果
false书名: Hadoop权威指南 价格: 0.01作者:name=xiaoli, gender=female, age=23姓名:xiaoli性别:female年龄:23书名: spark高级详解 价格: 0.01作者:name=azhong, gender=male, age=24姓名:azhong性别:male年龄:24
我们再类测试浅克隆
创建BookForDeep类实现Cloneable在这里我们需要修改clone方法,其他地方一样
public Object clone() throws CloneNotSupportedException { return super.clone(); }
写一个测试类,测试浅克隆
public class TestBookLowClone { public static void main(String[] args) throws CloneNotSupportedException { Book book1 = new Book("Hadoop权威指南", 0.1, new Person("阿中", "male", 24)); Book book2 = (Book) book1.clone(); System.out.println(book1.getAuthor()); System.out.println(book2.getAuthor()); System.out.println(book1.getAuthor() == book2.getAuthor()); book1.display(); book2.display();// 浅拷贝的问题:当更新副本中属性指向的对象内容时 原对象的属性会跟着一起变化 // 因为原对象中属性的对象与副本中属性的对象是同一个对象 book2.getAuthor().setName("Allen"); book2.getAuthor().setGender("female"); book1.display(); book2.display(); }}
运行结果
name=阿中, gender=male, age=24name=阿中, gender=male, age=24true书名: Hadoop权威指南价格: 0.1作者:name=阿中, gender=male, age=24姓名:阿中性别:male年龄:24书名: Hadoop权威指南价格: 0.1作者:name=阿中, gender=male, age=24姓名:阿中性别:male年龄:24书名: Hadoop权威指南价格: 0.1作者:name=Allen, gender=female, age=24姓名:Allen性别:female年龄:24书名: Hadoop权威指南价格: 0.1作者:name=Allen, gender=female, age=24姓名:Allen性别:female年龄:24
1 0
- java设计模式-克隆模式(复制模式)
- java设计模式——原型模式(克隆)
- Java 深复制(深克隆)&浅复制(浅克隆)&原型模式(ProtoType)
- java设计模式-原型模式(浅复制,深复制)
- 设计模式之原型模式(深克隆,浅克隆)
- JAVA设计模式---原型模式--浅客隆和深克隆
- java设计模式之原型模式,如何实现深克隆
- 原型模式、对象克隆(深复制、浅复制)
- 【设计模式】对象的克隆-原型模式
- 设计模式GOF23——克隆模式
- 原型模式设计克隆人
- 原型模式(克隆模式,拷贝模式)
- java设计模式学习笔记--原型模式(浅克隆和深克隆)
- 克隆模式
- java设计模式(2) 建造者模式,深复制与浅复制
- java设计模式---Prototype Pattern---原型模式(复制建立对象)
- 设计模式(java)
- Java(设计模式)
- 线程池介绍
- JavaScript-DOM
- 函数指针的使用
- macbook上的远程桌面
- Android消息机制
- java设计模式-克隆模式(复制模式)
- 策略设计模式
- Web.xml详解
- 浙大PAT 4-09. 笛卡尔树 (解题思路)
- dubbo+zookeeper服务器配置
- Android面试经验(转载)
- 朴素贝叶斯方法(Naive Bayes)
- 自定义Spark Streaming接收器(Receivers)
- leetcode--最长公共前缀--简单的字符串操作