原型模式

/**
 * 原型模式:其实就是对象的克隆,分为浅克隆和深克隆:浅克隆:对象的属性假如也是一个对象的话,那么拷贝的是属性对象的引用,克隆出来的对象对该属性的修改会影响原来对象的属性;
 * 深拷贝的话,要同时拷贝属性才行;深拷贝的另外一种方式是序列化和反序列化
 *
 */
//浅拷贝实现如下
public class Person implements Cloneable{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } @Override public Person clone() { Person p=null; try { p = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } public class Test { public static void main(String[] args) { //源型对象 Person person = new Person(); person.setName("kk"); System.out.println(person);//kk //复制后的对象 Person clone = person.clone(); System.out.println(clone);//kk System.out.println(clone==person);//false clone.setName("bb"); System.out.println(person);//kk System.out.println(clone);//bb } }
//存在属性是对象的时候的浅拷贝
//新加地址对象属性 public class Person implements Cloneable{ private String name; private Address address; public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } @Override public Person clone() { Person p=null; try { p = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } public class Address { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Test { public static void main(String[] args) { //源型对象 Person person = new Person(); Address address = new Address(); address.setName("广州"); person.setAddress(address); Person clone = person.clone(); System.out.println(clone.getAddress().getName());//广州 clone.getAddress().setName("北京"); //clone对象对地址对属性更改 System.out.println(person.getAddress().getName());//北京 原型和clone对象都受到影响 System.out.println(clone.getAddress().getName());//北京 } }

   //深拷贝的两种实现方式:

package com.yang.xiao.entity;

import java.io.*;

public class School implements Serializable,Cloneable {
    private String name;
    private Student student;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
    //clone方式实现序列化
   @Override
    protected School clone() throws CloneNotSupportedException {
        School school=null;
        school=(School) super.clone();
        if(null!=this.student){
            school.student=this.student.clone();
        }
        return school;
    }
    //序列化方式实现深拷贝
    protected School deptClone() {
        ByteArrayOutputStream bos=null;
        ObjectOutputStream os=null;
        ByteArrayInputStream bis=null;
        ObjectInputStream ois=null;
        School school=null;
        try {
             bos=new ByteArrayOutputStream();
             os=new ObjectOutputStream(bos);
             os.writeObject(this);
             bis=new ByteArrayInputStream(bos.toByteArray());
             ois=new ObjectInputStream(bis);
             school =(School) ois.readObject();
        }catch (Exception e){

        }finally {
            if(null!=bos){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //......todo 流的关闭
        }

        return school;

    }

    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", student=" + student +
                '}';
    }
}
package com.yang.xiao.entity;

import java.io.Serializable;

public class Student implements Serializable,Cloneable {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }

    public Student(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}
package com.yang.xiao.entity;

public class Test {
    public static void main(String[] args) throws Exception {
        School school = new School();
        school.setName("学校");
        Student student = new Student("学生");
        school.setStudent(student);

        //clone 方式实现深拷贝
        School school1 = school.clone();
        System.out.println(school == school1);
        System.out.println(school.getStudent() == school1.getStudent());
     //序列化方式实现深拷贝 
        School school2 = school.deptClone();
        System.out.println(school == school2);
        System.out.println(school.getStudent() == school2.getStudent());
        System.out.println(school2);
        

    }
}

 

posted @ 2019-05-23 12:04  yangxiaohui227  阅读(139)  评论(0)    收藏  举报