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

mac2024-03-27  29

原型模式即通过一个已有的对象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; } }
最新回复(0)