欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式-原型模式

程序员文章站 2022-06-12 20:21:59
...

大白话就是复制、克隆模式。生活场景就是,比如 现在我写的文章分了 1 2 3 模板结构,那我再写篇新的时候就想复用这个模板。

类似的就是word execl的复制。

用的技术实现:克隆(深拷贝、浅拷贝)

 /* @desc 使用Object 的clone()  必须实现 Cloneable 接口
 */
public class WeeklyLog implements Cloneable {
    //为了简化设计和实现,假设一份工作周报中只有一个附件对象,
    // 实际情况中可以包含多个附件,可以通过List等集合对象来实现
    private Attachment attachment;
    private String name;
    private String date;
    private String content;

    //使用Object 的clone() 方法实现浅克隆
    public WeeklyLog clone() {
        Object obj = null;
        try {
            obj = super.clone();
            return (WeeklyLog) obj;
        } catch (CloneNotSupportedException e) {
            System.out.println("不支持复制!");
            return null;
        }
    }
}
 public static void main(String[] args) {
        WeeklyLog weeklyLog, weeklyLog1;
        weeklyLog = new WeeklyLog();
        Attachment attachment = new Attachment(); //创建附件对象
        weeklyLog.setAttachment(attachment);  //将附件添加到周报中
        //使用Object 的clone() 方法实现浅克隆
        weeklyLog1 = weeklyLog.clone();
        //比较周报
        System.out.println("周报是否相同? " + (weeklyLog == weeklyLog1));

        //比较附件
        System.out.println("附件是否相同? " + (weeklyLog.getAttachment() == weeklyLog1.getAttachment()));
    }

周报是否相同? false
附件是否相同? true

很简单详细参照 https://www.cnblogs.com/chenssy/p/3313339.html

深度clone

/**
 * 深克隆技术实现了原型对象和克隆对象的完全独立,对任意克隆对象的修改都不会给其他对象产生影响
 * ,是一种更为理想的克隆实现方式
 */
public class WeeklyLog implements Serializable {
    private static final long serialVersionUID = 3006681994497865454L;
    //为了简化设计和实现,假设一份工作周报中只有一个附件对象,
    // 实际情况中可以包含多个附件,可以通过List等集合对象来实现
    private Attachment attachment;
    private String name;
    private String date;
    private String content;

    public WeeklyLog deepClone() {
        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
        try {
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            //this 当前对象
            oos.writeObject(this);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (WeeklyLog) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

周报是否相同? false
附件是否相同? false