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
原创粉丝点击