1.原型模式:对已有对象进行拷贝,降低消耗。
将对象A拷贝为对象A1、A2.。。。
2.浅拷贝:引用地址不变。(*String是常量,存放在常量区)
package Creating.pratice2; public class ProtoType { public static void main(String[] args) { Tree tree = new Tree(); tree.setBranch("主干"); tree.setLeaf("好多"); BridNest bridNest = new BridNest(); bridNest.setKind("big"); tree.setBridNest(bridNest); Tree treeC1 = tree.clone(); System.out.println(treeC1.getBranch()); tree.setYear(3); tree.setLeaf("多极了"); System.out.println(treeC1.getYear()); System.out.println(tree.getYear()); System.out.println(tree.getLeaf()); System.out.println(treeC1.getLeaf()); System.out.println(tree.getBridNest().getKind()); System.out.println(treeC1.getBridNest().getKind()); bridNest.setKind("big1"); tree.setBridNest(bridNest); System.out.println(tree.getBridNest().getKind()); System.out.println(treeC1.getBridNest().getKind()); treeC1.getBridNest().setKind("big2"); System.out.println(tree.getBridNest().getKind()); System.out.println(treeC1.getBridNest().getKind()); } } class Tree implements Cloneable{ private String branch; private String leaf; private int year; private BridNest bridNest; public String getBranch() { return branch; } public void setBranch(String branch) { this.branch = branch; } public String getLeaf() { return leaf; } public void setLeaf(String leaf) { this.leaf = leaf; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public BridNest getBridNest() { return bridNest; } public void setBridNest(BridNest bridNest) { this.bridNest = bridNest; } @Override protected Tree clone(){ Tree tree = null; try { tree = (Tree) super.clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } return tree; } @Override public String toString() { return "Tree [branch=" + branch + ", leaf=" + leaf + ", year=" + year + ", bridNest=" + bridNest + "]"; } } class BridNest{ private String kind; private String name; private int amount; public String getKind() { return kind; } public void setKind(String kind) { this.kind = kind; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } }
2.深克隆:完全不一样的两个对象,引用指向新的地址
//深克隆 protected Tree deepClone() { try { // 将对象写入流中 ByteArrayOutputStream bao = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bao); oos.writeObject(this); // 将对象从流中取出 ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (Tree) ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return null; }