zoukankan      html  css  js  c++  java
  • Java设计模式之原型模式

    1.关于原型模式的定义:原型模式属于对象的创建模式,是指通过给定的一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的方法创建出更多的同类型的对象。在java中简要    的可以理解为就是对已有对象的克隆,而对象的克隆可以分为浅克隆和深克隆。

    2.浅克隆和深克隆的区别

      浅克隆:拷贝原有对象的属性时,基本类型完全拷贝,引用类型拷贝的是引用的地址(即原有对象和拷贝对象引用的是同一个对象)。

      深克隆:拷贝原有对象的属性时,基本类型和引用类型都会拷贝一份。

    3.浅克隆和深克隆的实现

      浅克隆最简单的实现方式就是重写object的clone方法,重写之前该类需要继承Cloneable接口,代码如下:

    //1.继承Cloneable接口
    public class User implements Cloneable{
        private String name;
        private String gender;
        private List<Address> addressList;
    
        public User() {
    
        }
    
        public User(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public List<Address> getAddressList() {
            return addressList;
        }
    
        public void setAddressList(List<Address> addressList) {
            this.addressList = addressList;
        }
        //2.重写clone方法
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }

      深克隆的实现可以使用序列化的方式来实现,前提是需要克隆的类实现Serializable接口,代码如下:

    //1.继承Cloneable接口
    public class User implements Cloneable, Serializable {
        private String name;
        private String gender;
        private List<Address> addressList;
    
        public User() {
    
        }
    
        public User(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public List<Address> getAddressList() {
            return addressList;
        }
    
        public void setAddressList(List<Address> addressList) {
            this.addressList = addressList;
        }
        //2.重写clone方法
        @Override
        protected Object clone() throws CloneNotSupportedException {
            //return super.clone();
            return deepClone(this);
        }
    
        private Object deepClone(Object obj){
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = null;
            try {
                oos = new ObjectOutputStream(bos);
                oos.writeObject(obj);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    oos.close();
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = null;
            Object result = null;
            try {
                ois = new ObjectInputStream(bis);
                result = ois.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    ois.close();
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    }
  • 相关阅读:
    datasnap 2010 为DataSnap系统服务程序添加描述
    uLanguage.pas
    cxgrid上如何取FOOTER上合计的值
    cxgrid经典用法
    datasnap 2010 DataSnap服务端和客户端发布分发方法
    php_network_getaddresses: getaddrinfo failed 原因
    查看crontab运行状态
    laravel 开启定时任务需要操作
    解决cron不执行的问题
    UPdate语句
  • 原文地址:https://www.cnblogs.com/code-star/p/10513671.html
Copyright © 2011-2022 走看看