zoukankan      html  css  js  c++  java
  • 原型模式

    定义

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

    类图

    其他

    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一下!

    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    新年新气象,用新年的喜庆来迎接的生活
    vs2005中如何发布网站及打包web项目生成安装文件
    完整打印页面控件的解决方案
    vi使用体会
    向ATL DLL中传递C++对象
    CentOS 5.3配置软件源以及CVS服务器
    堆上多维数组的内存管理
    物理坐标与逻辑坐标
    好友列表的实现
    在STL中处理对象指针
  • 原文地址:https://www.cnblogs.com/studentytj/p/12405417.html
Copyright © 2011-2022 走看看