Java设计模式系列1--原型模式(Prototype Method)
2014-02-14 11:36
393 查看
2014-02-14 11:27:33
声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢!
原型模式,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。在Java中,复制对象是通过clone()实现的,调用的是Object的clone()方法,而在Object类中,clone()是native的。在这儿,我将结合对象的浅复制和深复制来说一下,首先需要了解对象深、浅复制的概念:
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
此处,写一个深、浅复制的例子:
Prototype.java
MainTest.java
注意红色代码,我们可以更换方法,分别调用深、浅两种clone方法,打出的log如下:
浅克隆:
看红色部分,打出来的对象hashcode是一样的。
深克隆:
看红、绿色部分,显然不一样,这说明克隆前后的SerializableObject obj对象不是同一个对象。
声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢!
原型模式,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。在Java中,复制对象是通过clone()实现的,调用的是Object的clone()方法,而在Object类中,clone()是native的。在这儿,我将结合对象的浅复制和深复制来说一下,首先需要了解对象深、浅复制的概念:
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
此处,写一个深、浅复制的例子:
Prototype.java
package com.david.prototype; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Prototype implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String string; private SerializableObject obj; /* 浅复制 */ public Object clone() throws CloneNotSupportedException { Prototype proto = (Prototype) super.clone(); return proto; } /* 深复制 */ public Object deepClone() throws IOException, ClassNotFoundException { /* 写入当前对象的二进制流 */ 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 getString() { return string; } public void setString(String string) { this.string = string; } public SerializableObject getObj() { return obj; } public void setObj(SerializableObject obj) { this.obj = obj; } } class SerializableObject implements Serializable { private static final long serialVersionUID = 1L; }
MainTest.java
package com.david.prototype; import java.io.IOException; public class MainTest { public static void main(String[] args) { Prototype pt = new Prototype(); pt.setString("Dawei"); pt.setObj(new SerializableObject()); System.out.println("pt = " + pt); System.out.println("pt.getString = " + pt.getString()); System.out.println("pt.getObj = " + pt.getObj()); System.out.println("============================================="); try { Prototype pt_clone = (Prototype) pt.deepClone(); System.out.println("pt = " + pt_clone); System.out.println("pt.getString = " + pt_clone.getString()); System.out.println("pt.getObj = " + pt_clone.getObj()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }/* catch (CloneNotSupportedException e) { e.printStackTrace(); }*/ } }
注意红色代码,我们可以更换方法,分别调用深、浅两种clone方法,打出的log如下:
浅克隆:
pt = com.david.prototype.Prototype@3ce53108 pt.getString = Dawei pt.getObj = com.david.prototype.SerializableObject@6af62373 ============================================= pt = com.david.prototype.Prototype@459189e1 pt.getString = Dawei pt.getObj = com.david.prototype.SerializableObject@6af62373
看红色部分,打出来的对象hashcode是一样的。
深克隆:
pt = com.david.prototype.Prototype@2e6e1408 pt.getString = Dawei pt.getObj = com.david.prototype.SerializableObject@3ce53108 ============================================= pt = com.david.prototype.Prototype@7ecd2c3c pt.getString = Dawei pt.getObj = com.david.prototype.SerializableObject@5013582d
看红、绿色部分,显然不一样,这说明克隆前后的SerializableObject obj对象不是同一个对象。
相关文章推荐
- Java/Android 设计模式系列(11)--原型模式
- 常用Java设计模式系列(2)- 原型模式
- JAVA系列-设计模式-原型模式
- Java设计模式菜鸟系列(十六)原型模式建模与实现
- 设计模式系列之----原型模式
- java设计模式——原型模式
- java设计模式笔记之原型模式
- 设计模式系列-原型模式
- JAVA设计模式 值得认真看看的系列文章
- Java设计模式之原型模式的分析
- [Java] 设计模式之工厂系列 02-面向抽象编程 抽象工厂 - 缺点 : 产生新的产品品种的时候,改动太多
- 炒冷饭系列:设计模式 原型模式
- java设计模式之原型模式
- Java设计模式_创建模式_原型模式
- JAVA系列-设计模式-中介者模式
- java设计模式之原型模式
- 浅谈JAVA设计模式之——原型模式(Prototype)
- java设计模式-原型模式
- Java设计模式之原型模式
- java设计模式5--原型模式(Prototype)