• 设计模式学习(四) 原型模型


    使用场景

    -- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

    -- 就是java中的克隆技术,以某个对象为原型复制出新的对象 ,显然,新的对象具备原型对象的特点

    优势:

    效率高(直接克隆,避免了重新执行构造的过程步骤)。

    克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同,并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值

    原型模式实现:

      -- Cloneable接口和clone方法

      -- ProtoType模式中实现起来最困难的地方就是内存复制操作,所幸在java中提供了clone方法替我们做的绝大部分事情

    浅复制代码:

    package com.lp.prototype;
    
    import java.util.Date;
    
    public class Sheep implements Cloneable {
        private String name;
        private Date birthday;
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Object obj = super.clone();//直接调用Object的clone方法    
            return obj;
        }
    
        public Sheep(String name, Date birthday) {
            super();
            this.name = name;
            this.birthday = birthday;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        
        Sheep(){
            
        }
        
        
    
    }
    sheep类
    package com.lp.prototype;
    
    import java.util.Date;
    
    public class Client {
        public static void main(String[] args) throws Exception{
            Date date = new Date(1861381234L);
            Sheep s1 = new Sheep("多利",date);
            Sheep s2 = (Sheep)s1.clone();
            
            date.setTime(23456789L);
            s1.setBirthday(date);
            
            s1.setName("少利");
            System.out.println(s1.getName());
            System.out.println(s1.getBirthday());
            System.out.println(s1);
            
            System.out.println(s2.getName());
            System.out.println(s2.getBirthday());
            System.out.println(s2);
            //这里s1 和s2 的对象不同 但是值是一样的
            //浅复制只复制一个对象的值类型数据和引用的地址   
            // 所以他们两个的date对象指的是同一个对象  故而只要修改其中的一个的值 另外一个还会发生变化
        }
    }
    Client

     结果:

    这里修改了日期对象  ,他们两个的值都变化了  可见复制的不是对象的全部引用类型只是复制了引用而不是对象。

    深复制代码:

    package com.lp.prototype;
    
    import java.util.Date;
    
    public class Sheep implements Cloneable {
        private String name;
        private Date birthday;
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Object obj = super.clone();//直接调用Object的clone方法
            
            //添加如下代码实现深复制
            Sheep s = (Sheep)obj;
            s.birthday= (Date)this.birthday.clone();
            
            
            return obj;
        }
    
        public Sheep(String name, Date birthday) {
            super();
            this.name = name;
            this.birthday = birthday;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        
        Sheep(){
            
        }
        
        
    
    }
    sheep
    package com.lp.prototype;
    
    import java.util.Date;
    
    public class Client {
        public static void main(String[] args) throws Exception{
            Date date = new Date(1861381234L);
            Sheep s1 = new Sheep("多利",date);
            Sheep s2 = (Sheep)s1.clone();
            
            date.setTime(23456789L);
            s1.setBirthday(date);
            
            s1.setName("少利");
            System.out.println(s1.getName());
            System.out.println(s1.getBirthday());
            System.out.println(s1);
            
            System.out.println(s2.getName());
            System.out.println(s2.getBirthday());
            System.out.println(s2);
            //这里s1 和s2 的对象不同 但是值是一样的
            //浅复制只复制一个对象的值类型数据和引用的地址   
            // 所以他们两个的date对象指的是同一个对象  故而只要修改其中的一个的值 另外一个还会发生变化
        }
    }
    client

    结果:

    这样就可以实现深复制了

  • 相关阅读:
    [LeetCode] 75. 颜色分类(荷兰国旗)
    [LeetCode] 347. 前K个高频元素
    CMU-14445 数据库原理 汇总
    MIT-6.824 操作系统 汇总
    发布一个基于协程和事件循环的c++网络库
    记录一次gdb debug经历
    彻底弄懂UTF-8、Unicode、宽字符、locale
    CPU使用率原理及计算方式
    TCP使用注意事项总结
    STL-vector
  • 原文地址:https://www.cnblogs.com/lipeng0824/p/4423518.html
Copyright © 2020-2023  润新知