原型模式
原型模式:有一个对象A,在不使用创建的情况下,得到一个与A一样的对象AC。AC即被称为原型。
实现这个模式,一般使用克隆的方式,需要实现Cloneable接口。
也就是使用JAVA的克隆技术。
克隆分为“深克隆”、“浅克隆”。
深克隆需要实现Serializable接口,使用 流 技术。
浅克隆只需要实现Cloneable接口,重写clone方法。
?
代码如下:请注意观察结果内,数据的不同,对象地址的不同。
?
浅克隆
package com.mkf.pattern;import java.io.Serializable;public class ClassOne implements Serializable {private static final long serialVersionUID = -1393695894851384014L;private String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}}package com.mkf.pattern;public class PrototypePattern implements Cloneable {private String str;private Integer ieg;private ClassOne co;@Overridepublic PrototypePattern clone() throws CloneNotSupportedException {return (PrototypePattern) super.clone();}public String getStr() {return str;}public void setStr(String str) {this.str = str;}public Integer getIeg() {return ieg;}public void setIeg(Integer ieg) {this.ieg = ieg;}public ClassOne getCo() {return co;}public void setCo(ClassOne co) {this.co = co;}/** * 浅克隆 */public static void test1() throws CloneNotSupportedException {ClassOne co = new ClassOne();co.setStr("iop");PrototypePattern pp = new PrototypePattern();pp.setStr("abc");pp.setIeg(123);pp.setCo(co);PrototypePattern pp1 = pp.clone();System.out.println(pp1.getStr() + "\t" + pp1.getIeg() + "\t"+ pp1.getCo().getStr() + "\t" + pp1.getCo() + "\t" + pp1);pp1.setStr("xyz");pp1.setIeg(456);pp1.getCo().setStr("qwe");System.out.println(pp.getStr() + "\t" + pp.getIeg() + "\t"+ pp.getCo().getStr() + "\t" + pp.getCo() + "\t" + pp);pp.setStr("hij");pp.setIeg(789);pp.getCo().setStr("fgh");System.out.println(pp1.getStr() + "\t" + pp1.getIeg() + "\t"+ pp1.getCo().getStr() + "\t" + pp1.getCo() + "\t" + pp1);System.out.println(pp.getStr() + "\t" + pp.getIeg() + "\t"+ pp.getCo().getStr() + "\t" + pp.getCo() + "\t" + pp);}public static void main(String[] args) throws CloneNotSupportedException {test1();}}?
浅克隆结果:
?
abc? 123 ?iop??? com.mkf.pattern.ClassOne@61de33? ?com.mkf.pattern.PrototypePattern@14318bb
abc ?123 ?qwe? com.mkf.pattern.ClassOne@61de33?? com.mkf.pattern.PrototypePattern@ca0b6
xyz ?456 ?fgh?? ?com.mkf.pattern.ClassOne@61de33? ?com.mkf.pattern.PrototypePattern@14318bb
hij ? 789 ?fgh??? ?com.mkf.pattern.ClassOne@61de33?? com.mkf.pattern.PrototypePattern@ca0b6
?
深克隆:
?
package com.mkf.pattern;import java.io.Serializable;public class ClassOne implements Serializable {private static final long serialVersionUID = -1393695894851384014L;private String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}}package com.mkf.pattern;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class PrototypePatternTwo implements Cloneable, Serializable {private static final long serialVersionUID = -2021064356103593636L;private String str;private Integer ieg;private ClassOne co;public Object deepClone() throws Exception {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return ois.readObject();}public String getStr() {return str;}public void setStr(String str) {this.str = str;}public Integer getIeg() {return ieg;}public void setIeg(Integer ieg) {this.ieg = ieg;}public ClassOne getCo() {return co;}public void setCo(ClassOne co) {this.co = co;}/** * 深克隆 */public static void test1() throws Exception {ClassOne co = new ClassOne();co.setStr("iop");PrototypePatternTwo pp = new PrototypePatternTwo();pp.setStr("abc");pp.setIeg(123);pp.setCo(co);PrototypePatternTwo pp1 = (PrototypePatternTwo) pp.deepClone();System.out.println(pp1.getStr() + "\t" + pp1.getIeg() + "\t"+ pp1.getCo().getStr() + "\t" + pp1.getCo() + "\t" + pp1);pp1.setStr("xyz");pp1.setIeg(456);pp1.getCo().setStr("qwe");System.out.println(pp.getStr() + "\t" + pp.getIeg() + "\t"+ pp.getCo().getStr() + "\t" + pp.getCo() + "\t" + pp);pp.setStr("hij");pp.setIeg(789);pp.getCo().setStr("fgh");System.out.println(pp1.getStr() + "\t" + pp1.getIeg() + "\t"+ pp1.getCo().getStr() + "\t" + pp1.getCo() + "\t" + pp1);System.out.println(pp.getStr() + "\t" + pp.getIeg() + "\t"+ pp.getCo().getStr() + "\t" + pp.getCo() + "\t" + pp);}public static void main(String[] args) throws Exception {test1();}}?
深克隆结果:
?
abc? 123 ?iop????com.mkf.pattern.ClassOne@c20e24? ?com.mkf.pattern.PrototypePatternTwo@2e7263
abc ?123 ?iop?? ?com.mkf.pattern.ClassOne@a62fc3??? com.mkf.pattern.PrototypePatternTwo@530daa
xyz? 456 ?qwe ?com.mkf.pattern.ClassOne@c20e24?? com.mkf.pattern.PrototypePatternTwo@2e7263
hij?? ?789 ?fgh???com.mkf.pattern.ClassOne@a62fc3??? com.mkf.pattern.PrototypePatternTwo@530daa