• 原型模式


    定义

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    类图

    其他

    1. 优点:
      性能优良: 原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多
      逃避构造函数约束(优缺点并存):
    2. 使用场景
      资源优化场景
      性能和安全要求的场景
      一个对象多个修改者的场景
      (实际项目中,很少单独出现,通常和工厂方法模式一起出现)
    3. 对象拷贝时构造函数不执行

    浅拷贝和深拷贝

    @Getter
    @Setter
    @ToString
    public class ShallowClone implements Cloneable {
        private List<String> list = new ArrayList<>();
        private List<String> val = new ArrayList<>();
        @Override
        protected ShallowClone clone() throws CloneNotSupportedException {
            return (ShallowClone) super.clone();
        }
    
        public void setValue(String value) {
            val.add(value);
        }
    
        public List<String> getValue() {
            return val;
        }
    }
    
    class DeepClone implements Cloneable {
        private List<String> val = new ArrayList<>();
        @Override
        protected DeepClone clone() throws CloneNotSupportedException {
            DeepClone clone = (DeepClone) super.clone();
            // 深拷贝增加了对私有引用变量的克隆
            clone.val = (List<String>) ((ArrayList) this.val).clone();
            return clone;
        }
    
        public void setValue(String value) {
            val.add(value);
        }
    
        public List<String> getValue() {
            return val;
        }
    }
    
    
    class Test {
        public static void main(String[] args) throws CloneNotSupportedException {
            ShallowClone shallowClone = new ShallowClone();
            shallowClone.setList(Collections.singletonList("a"));
            shallowClone.setValue("张三");
            ShallowClone clone = shallowClone.clone();
            clone.setList(Collections.singletonList("b"));
            clone.setValue("李四");
            System.out.println(shallowClone);
            System.out.println(clone);
    
            DeepClone deepClone = new DeepClone();
            deepClone.setValue("zhangsan");
            DeepClone clone1 = deepClone.clone();
            clone1.setValue("lisi");
            System.out.printf(deepClone.getValue().toString());
        }
    }
    

    输出如下:

    ShallowClone(list=[a], val=[张三, 李四])
    ShallowClone(list=[b], val=[张三, 李四])
    [zhangsan]
    

    list的不同是因为改变了clone改变了list的指针。

    记住,内部的数组和引用对象是不会被拷贝的,如果你想深拷贝,记得把他们也clone一下!

    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    JavaScript Date对象和函数 (一)
    Css3 文字渐变整理(一)
    Asp.net Core CacheHelper 通用缓存帮助类
    .net core中使用GB2312编码的问题
    苹果手机微信浏览器select标签选择完成之后页面不会自动回到原位
    .Net Core NOPI操作word(二) 表格操作
    .Net Core NOPI操作word(一)
    .NetCore中EFCore的使用整理(三)-关联表操作
    windos server2012安装.net core 2.2问题
    C# 最简单的使程序单进程运行的方法
  • 原文地址:https://www.cnblogs.com/studentytj/p/12405417.html
Copyright © 2020-2023  润新知