• [一天一个设计模式]-[原型模式]


    原型模式即通过一个已有的对象clone出一个一样的对象,当直接创建该对象非常消耗资源时则可以考虑原型模式。实现克隆操作,继承 Cloneable,重写object的 clone()。

    克隆分深度克隆和浅度克隆
      浅度克隆:只把需要克隆对象的成员变量的值复制过去,如果是引用变量也只会复制引
      用地址,指向的和原对象是同一个对象。
      
      深度克隆:把需要克隆对象的引用成员变量也克隆一份。
    
    浅度克隆
    public class SimpleClone implements Cloneable {  
    
        public int s = null;    
        
        public SimpleClone() {  
        }  
      
        public Object clone() {  
            SimpleClone newSimpleClone =  null;  
            try {  
                /* 浅克隆 */  
                newSimpleClone = (SimpleClone)super.clone();  
            } catch (CloneNotSupportedException e) {  
                e.printStackTrace();  
            }  
            return newSimpleClone;  
        }  
    }  
    
    深度克隆
    重写clone方法,在clone方法中把需要克隆的成员变量也clone一份让后赋值
    (此方法只支持,成员变量也为cloneable)
    
    
    public class SimpleClone implements Cloneable {  
    
        public Object s = null;    
        
        public SimpleClone() {  
        }  
      
        public Object clone() {  
            SimpleClone newSimpleClone =  null;  
            try {  
                /* 浅克隆 */  
                newSimpleClone = (SimpleClone)super.clone();  
                newSimpleClone.s=s.clone()
            } catch (CloneNotSupportedException e) {  
                e.printStackTrace();  
            }  
            return newSimpleClone;  
        }  
    }  
    
    
    通过序列化方式(此方式需要成员变量均实现Serializable接口)
    
    
    public class SimpleClone implements Cloneable,Serializable {  
    
        public Object s = null;    
        
        public SimpleClone() {  
        }  
      
        public Object clone() {  
            SimpleClone newSimpleClone =  null;  
            try{ 
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(this);
                oos.close();
                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                ObjectInputStream ois = new ObjectInputStream(bais);
                newSimpleClone = ois.readObject();
                ois.close(); 
            } catch (IOException e){
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return newSimpleClone;  
        }  
    }  
    
    
  • 相关阅读:
    Spring Cloud
    Java/Android 网络请求框架/库
    Spring Roo 想知道源码,怎么实现自动生成枯燥的有规律的文件
    win10操作系统系统,小米路由器,小米3 的问题
    IntelliJ IDEA
    Spring Boot
    echart 插件实现全国地图
    安装AndroidJDK的坑
    小程序进阶之路
    关于echart柱形图的使用问题
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026940.html
Copyright © 2020-2023  润新知