zoukankan      html  css  js  c++  java
  • [一天一个设计模式]-[原型模式]

    原型模式即通过一个已有的对象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;  
        }  
    }  
    
    
  • 相关阅读:
    面向对象
    linux下apache重启报错
    mysql登录密码忘记怎么办?
    html基础知识梳理
    用js实现贪吃蛇
    简单轮播图案例
    JavaScript基础学习笔记整理
    读书笔记之《Redis开发与运维》—— 三
    读书笔记之《Redis开发与运维》—— 二
    读书笔记之《Redis开发与运维》—— 一
  • 原文地址:https://www.cnblogs.com/A-yes/p/12026940.html
Copyright © 2011-2022 走看看