天天看点

GOF——原型模式

在已有对象的基础上,复制该对象的属性.

new一个对象需要非常繁琐的数据准备时,使用原型模式,更加快速.

/**
 * 浅复制--修改老对象属性新对象也会变
 */
class Person implements Cloneable,Serializable {
    private String name;
    private Date age;

    public Person() {
    }

    public Person(String name, Date age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Date getAge() {
        return age;
    }

    public void setAge(Date age) {
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
           
/**
 * 深复制--修改老对象属性不会影响新对象属性
 */
class DeepPerson implements Cloneable {
    private String name;
    private Date age;

    public DeepPerson() {
    }

    public DeepPerson(String name, Date age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Date getAge() {
        return age;
    }

    public void setAge(Date age) {
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //深复制属性也复制
        Object clone = super.clone();
        DeepPerson deepPerson = (DeepPerson) clone;
        deepPerson.age = (Date) this.age.clone();
        return clone;
    }

    @Override
    public String toString() {
        return "DeepPerson{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
           
/**
 *
 *序列化实现深复制
 *
 */
@Test
public void myTest(){
        Date age2 = new Date();
        Person person2 = new Person("张三", age2);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(person2);

        byte[] bytes = bos.toByteArray();

        ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
        ObjectInputStream oin = new ObjectInputStream(bin);
        Person person3 = (Person) oin.readObject();
        System.out.println(person2.toString());
        age2.setTime(new Date().getTime() + 9999999999L);
        System.out.println(person2.toString());
        System.out.println(person3.toString()):
}