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

    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    通过jarjar.jar来替换jar包名的详细介绍
    Android开发中adb启动失败adb连接异常的解决办法
    App你真的需要么
    MVC5 网站开发之九 网站设置
    MVC5 网站开发之八 栏目功能 添加、修改和删除
    MVC5 网站开发之七 用户功能 3用户资料的修改和删除
    Ninesky源代码从Codeplex迁移到开源中国
    MVC5 网站开发之七 用户功能 2 用户添加和浏览
    赶个项目,博客稍后更新
    MVC5 网站开发之七 用户功能 1、角色的后台管理
  • 原文地址:https://www.cnblogs.com/studentytj/p/12405417.html
Copyright © 2011-2022 走看看