原型模式

121 阅读1分钟
/**
 * 原型模式
 * 个人理解:原型模式就是对象实现复制的方法。两种方法:浅克隆和深克隆。
 *  浅克隆:通过实现Cloneable接口来浅克隆,引用类型的成员变量是引用地址的复制。本例中DailyTemplate.clone()方法。
 *  深克隆:通过序列化来深克隆,引用类型的成员变量是对象的复制。本例中DailyTemplate.deepClone()方法。
 * 组件:原型类(Prototype,本例中DailyTemplate)、
 *  被克隆对象(本例中dailyTemplate1、dailyTemplate2都克隆自dailyTemplate对象)、客户类(Client)
 * 注意点:需要客户端选择需要调用的具体工厂和具体产品方法
 *
 */
public class PrototypeDesignPattern {

    public static void main(String[] args) {
        //浅克隆方式
        Attachment attachment = new Attachment("日报", "test");
        DailyTemplate dailyTemplate = new DailyTemplate("张三", "2021-08-06", "李四", attachment);
        DailyTemplate dailyTemplate1 = dailyTemplate.clone();
        System.out.println("日期:"+dailyTemplate1.getDate());
        System.out.println("发送人:"+dailyTemplate1.getSender());
        System.out.println("接收人:"+dailyTemplate1.getReceiver());
        System.out.println(dailyTemplate.getAttachment() == dailyTemplate1.getAttachment());
        //深克隆方式
        DailyTemplate dailyTemplate2 = dailyTemplate.deepClone();
        System.out.println("日期:"+dailyTemplate2.getDate());
        System.out.println("发送人:"+dailyTemplate2.getSender());
        System.out.println("接收人:"+dailyTemplate2.getReceiver());
        System.out.println(dailyTemplate.getAttachment() == dailyTemplate2.getAttachment());
    }
}

class DailyTemplate implements Cloneable, Serializable {
    private String sender;
    private String date;
    private String receiver;
    private Attachment attachment;

    public DailyTemplate(String sender, String date, String receiver, Attachment attachment) {
        this.sender = sender;
        this.date = date;
        this.receiver = receiver;
        this.attachment = attachment;
    }
    @Override
    public DailyTemplate clone() {
        try {
            return (DailyTemplate) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 深克隆 通过序列化方式
     * @return
     */
    public DailyTemplate deepClone() {
        try (
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bos)
        ) {
            oos.writeObject(this);
            try (
                    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
                    ObjectInputStream ois = new ObjectInputStream(bis)
            ) {
                return (DailyTemplate) ois.readObject();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    public Attachment getAttachment() {
        return attachment;
    }

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

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }
}

class Attachment implements Serializable {
    private String name;
    private String content;

    public Attachment(String name, String content) {
        this.name = name;
        this.content = content;
    }

    public String getName() {
        return name;
    }

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

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}