java设计模式----原型模式
2017-12-10 12:15
232 查看
原型模式设计思想就是以一个对象为原型,然后对其复制,克隆,然后产生一个与原对象相似的对象。在java中,复制对象是通过集成Cloneable接口,复制对象是通过调用clone()方法来实现的。注意:该接口其实是一个标记型接口,内部是空的,clone方法是属于Object类的native方法,也就是本地调用。而复制又分为浅复制和深复制。看个例子来看深浅复制的区别:
原型类:
测试类:
输出结果:
可以看出:不论深浅复制基本数据类型变量会被重新创建(未做考究),而浅复制引用类型变量复制出的对象指
向原对象的引用类型变量,深复制则是创建出一个新的引用类型变量。
原型类:
package cn.lh.designer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Prototype implements Cloneable,Serializable{ private String str; private boolean a; private CopyObject obj; public Prototype() { } public Prototype(String str,boolean a) { this.str = str; this.a = a; this.obj = new CopyObject(); } private static final long serialVersionUID = 7977153787302907877L; /** * 浅复制 */ @Override public Object clone() throws CloneNotSupportedException { Prototype pro = (Prototype) super.clone(); return pro; } /** * 深复制 * @return * @throws Exception */ public Object deepClone() throws Exception{ //写入当前对象的二进制流 ByteArrayOutputStream bao = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bao); oos.writeObject(this); //读出对象的二进制流 ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } public String getStr() { return str; } public void setStr(String str) { this.str = str; } public CopyObject getObj() { return obj; } public void setObj(CopyObject obj) { this.obj = obj; } public boolean getA() { return a; } public void setA(boolean a) { this.a = a; } class CopyObject implements Serializable{ private static final long serialVersionUID = 1525222; } }
测试类:
package cn.lh.designer; public class PrototypeTest { public static void main(String[] args) throws Exception { Prototype pro = new Prototype("你好",false); Prototype pro1 = (Prototype) pro.clone(); Prototype pro2 = (Prototype) pro.deepClone(); System.out.println("基本数据类型:"+pro.getA()+";引用数据类型:"+pro.getObj()); System.out.println("基本数据类型:"+pro1.getA()+";引用数据类型:"+pro1.getObj()); System.out.println("基本数据类型:"+pro2.getA()+";引用数据类型:"+pro2.getObj()); } }
输出结果:
基本数据类型:false;引用数据类型:cn.lh.designer.Prototype$CopyObject@42a57993 基本数据类型:false;引用数据类型:cn.lh.designer.Prototype$CopyObject@42a57993 基本数据类型:false;引用数据类型:cn.lh.designer.Prototype$CopyObject@4554617c
可以看出:不论深浅复制基本数据类型变量会被重新创建(未做考究),而浅复制引用类型变量复制出的对象指
向原对象的引用类型变量,深复制则是创建出一个新的引用类型变量。
相关文章推荐
- JAVA设计模式(五)——原型模式
- JAVA设计模式之原型模式
- Java设计模式 原型模式(Prototype)
- java设计模式之原型模式
- Java/Android 设计模式系列(11)--原型模式
- java设计模式---原型模式
- 233_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_原型模式_prototype_浅复制_深复制_反序列化实现深复制
- JAVA设计模式---原型模式
- Java设计模式——原型模式
- Java设计模式四: 原型模式(Prototype Pattern)
- java23种设计模式之原型模式(Prototype)
- java设计模式之原型模式
- Java设计模式百例 - 原型模式
- Java设计模式之原型模式的分析
- Java设计模式_创建模式_原型模式
- Java设计模式笔记之原型模式
- Java设计模式—原型模式
- Java设计模式-----Prototype原型模式
- java 23种常用设计模式之原型模式(Prototype)
- java设计模式——原型模式