2023-03-27
原文作者:ClarenceZero 原文地址:https://blog.csdn.net/ClarenceZero/article/details/106996361

原型模式

定义

如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。

类图

202303272240288821.png

实现

1. 浅拷贝

    @Data
    public class SearchWords implements Cloneable{
        String keyWorld;
        long updateTimeStamp;
        long lastUpdateTime;
        ReferenceClass referenceClass;
    
        public SearchWords(String keyWorld, long lastUpdateTime) {
            this.keyWorld = keyWorld;
            this.lastUpdateTime = lastUpdateTime;
        }
    
        @Override
        protected SearchWords clone() throws CloneNotSupportedException {
            SearchWords content = null;
            try {
                content = (SearchWords)super.clone();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return content;
        }
    
        @Override
        public String toString() {
            return "SearchContent{" +
                    "keyWorld='" + keyWorld + '\'' +
                    ", updateTimeStamp=" + updateTimeStamp +
                    '}';
        }
    }

2. 深拷贝

    public Object deepCopy(Object object) throws Exception{
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(bo);
        objectOutputStream.writeObject(object);
    
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(bi);
        return oi.readObject();
    }

总结

  1. 浅拷贝深拷贝的区别在于: 浅拷贝只会复制的索引,不会复制数据本身。相反,深拷贝不仅会复制索引,还会复制数据本身。浅拷贝得到的对象和原始对象共享数据,而深拷贝得到的是一份独立的对象
  2. 如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了
阅读全文