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

    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    解疑网络监控卡壳 视觉体验400ms延时
    DDD实战11 在项目中使用JWT的token 进行授权验证
    在sql语句中 inner join ,left join,right join 和on 以及where
    在.net core自带DI中服务生命周期 Transient,Scoped,Singleton
    DDD实战10 在项目中使用JWT的token
    简单使用.net core 自带的DI
    在.net core中一个简单的加密算法
    DDD实战9 经销商领域上下文
    DDD实战8_2 利用Unity依赖注入,实现接口对应实现类的可配置
    DDD实战8_1 实现对领域中连接字符串的可配置
  • 原文地址:https://www.cnblogs.com/studentytj/p/12405417.html
Copyright © 2011-2022 走看看