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

原型模式即通过一个已有的对象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;  
    }  
}  

posted @ 2019-12-12 08:56  A_yes  阅读(135)  评论(0编辑  收藏  举报