Java原型模式

浅克隆:

深克隆:

Java语言提供的clone()方法满足:

1.对任何的对象x,都有x.clone() != x,即克隆对象与愿对象不是同一个对象。

2.对任何的对象x,都有x.clone().getClass == x.getClass(),即克隆对象与原对象的类型一样。

3.如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

邮箱复制(浅克隆):

Attachment:

public class Attachment {
    public void download(){
        System.out.println("Download:");
    }
}

Email:

public class Email implements Cloneable{
    Attachment attachment = null;

    public Email clone(){
        Object object = null;
        try{
            object = super.clone();
        }catch (CloneNotSupportedException e){
            System.err.println("Not support cloneable!");
            return null;
        }
        return (Email)object;
    }

    public void display(){
        System.out.println("i don't know what i need to display!");
    }

    public void setAttachment(Attachment attachment) {
        this.attachment = attachment;
    }

    public Attachment getAttachment() {
        return this.attachment;
    }
}

Client:

public class Client {
    public static void main(String[] args){
        Email email = new Email();
        Attachment attachment = new Attachment();
        email.setAttachment(attachment);
        Email email_1;
        email_1 = email.clone();
        System.out.println("email 和 email_1 是否相同? " + (email == email_1));
        System.out.println("email 和 email_1 的类型是否相同? " + (email.getClass() == email_1.getClass()));
        System.out.println("email的附件 and email_1的附件是否相同? " + (email.getAttachment() == email_1.getAttachment()));
    }
}

Result:

email 和 email_1 是否相同? false
email 和 email_1 的类型是否相同? true
email的附件 and email_1的附件是否相同? true

邮箱复制(深克隆):通过序列化与反序列化进行深度克隆。

 

Attachment:

import java.io.Serializable;

public class Attachment implements Serializable{
    public void download(){
        System.out.println("Download");
    }
}

Email:

import java.io.*;

public class Email implements Serializable{
    private Attachment attachment;

    public void setAttachment(Attachment attachment){
        this.attachment = attachment;
    }

    public Attachment getAttachment() {
        return this.attachment;
    }

    public void dislay(){
        System.out.println("...");
    }

    public Email deepClone() throws IOException,ClassNotFoundException,OptionalDataException{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);

        return (Email)ois.readObject();
    }
}

Client:

public class Client {
    public static void main(String[] args){
        Email email = new Email();
        Email email_1 = null;
        Attachment attachment = new Attachment();
        email.setAttachment(attachment);
        try {
            email_1 = email.deepClone();
        }catch (Exception e){
            System.err.println("deepClone failed!");
        }
        System.out.println("email 和 email_1 是否相同? " + (email == email_1));
        System.out.println("email 和 email_1 的类型是否相同? " + (email.getClass() == email_1.getClass()));
        System.out.println("email的附件 and email_1的附件是否相同? " + (email.getAttachment() == email_1.getAttachment()));
    }
}

Result:

email 和 email_1 是否相同? false
email 和 email_1 的类型是否相同? true
email的附件 and email_1的附件是否相同? false

 

原文地址:https://www.cnblogs.com/softwarecrash/p/8666810.html