GOF23设计模式之原型模式之实现
2015-04-03 21:42
323 查看
/** * Sheep类,测试原型模式之浅拷贝 * 时间:2015年4月1日09:44:29 */ package com.bjsxt.cn.prototype;
import java.io.Serializable; import java.util.Date;
public class Sheep implements Cloneable, Serializable { private String name; private Date date; public Sheep() {
}
public Sheep(String name, Date date) { super(); this.name = name; this.date = date; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Date getDate() { return date; }
public void setDate(Date date) { this.date = date; } @Override protected Object clone() throws CloneNotSupportedException {//通过这个方法的两行代码实现浅克隆 Object object = super.clone(); return object; } }
/** * Sheep类,测试原型模式之浅拷贝 * 时间:2015年4月1日09:44:29 */ package com.bjsxt.cn.prototype;
import java.util.Date;
public class Sheep2 implements Cloneable { private String name; private Date date; public Sheep2() {
}
public Sheep2(String name, Date date) { super(); this.name = name; this.date = date; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Date getDate() { return date; }
public void setDate(Date date) { this.date = date; } @Override protected Object clone() throws CloneNotSupportedException { Object object = super.clone(); //通过增加的这几行实现深复制 Sheep2 sheep = (Sheep2) object; sheep.date = (Date) this.date.clone(); return object; } }
/** * 测试浅克隆 * 时间:2015年4月1日09:48:21 * 程序理解:该小程序测试了圆形模式浅克隆的相关问题。对比程序和运行结果,我们可以看出以下几点: * 1, 在修改之后,确实实现了复制,并且s1和s2的作为对象,所指向的属性值完全相同 * 2, s1和s2作为局部变量,值并不一样。并且根据打印的结果,它们都属于Sheep类型 * 3, s1和s2为Sheep对象,该类具有Date属性,但是s1和s2的date属性指向了同样的内存空间。这可以通过 * 我们修改了date的值以后,s1和s2的属性date都跟着改变了。显然,在某些情况下,这不符合我们的要求,因为 * s1和s2还有粘连。我们希望它们能彼此独立。修改一个对象,与另一个对象无关。当然这就是浅拷贝的问题所在了 * */package com.bjsxt.cn.prototype;
import java.util.Date;
public class Client1 { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(3234324435L); Sheep s1 = new Sheep("少莉", date); Sheep s2 = (Sheep) s1.clone(); System.out.println("----------修改之前------------"); System.out.println(s1.getClass()); System.out.println(s1); System.out.println(s1.getName()); System.out.println(s1.getDate()); System.out.println(s2.getClass()); System.out.println(s2); System.out.println(s2.getName()); System.out.println(s2.getDate()); System.out.println("----------修改-----------"); date.setTime(4323423423L); System.out.println("----------修改之后-------------"); System.out.println(s1); System.out.println(s1.getName()); System.out.println(s1.getDate()); System.out.println(s2); System.out.println(s2.getName()); System.out.println(s2.getDate()); }}/* * ----------修改之前------------ com.bjsxt.cn.prototype.Sheep@659e0bfd 少莉 Sat Feb 07 18:25:24 CST 1970 com.bjsxt.cn.prototype.Sheep@4e25154f 少莉 Sat Feb 07 18:25:24 CST 1970 ----------修改----------- ----------修改之后------------- com.bjsxt.cn.prototype.Sheep@659e0bfd 少莉 Fri Feb 20 08:57:03 CST 1970 com.bjsxt.cn.prototype.Sheep@4e25154f 少莉 Fri Feb 20 08:57:03 CST 1970
* * */
/** * 测试深拷贝 * 时间:2015年4月1日09:48:21 * 程序理解:该小程序测试了原型模式深克隆的相关问题。对比程序和运行结果,我们可以看出以下几点: * 通过程序,我们可以看出,在Sheep2类中的clone方法中增加了几行语句 * @Override protected Object clone() throws CloneNotSupportedException { Object object = super.clone(); //通过增加的这几行实现深复制 Sheep2 sheep = (Sheep2) object; sheep.date = (Date) this.date.clone(); return object; } 就实现了深拷贝,这是通过我们对属性也进行了深拷贝实现的。 */package com.bjsxt.cn.prototype;
import java.util.Date;
public class Client2 { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(3234324435L); String name = new String("少莉"); Sheep2 s1 = new Sheep2(name, date); Sheep2 s2 = (Sheep2) s1.clone(); System.out.println("----------修改之前------------"); System.out.println("s1-------------"); System.out.println(s1.getClass()); System.out.println(s1); System.out.println(s1.getName()); System.out.println(s1.getDate()); System.out.println(); System.out.println("s2-------------"); System.out.println(s2.getClass()); System.out.println(s2); System.out.println(s2.getName()); System.out.println(s2.getDate()); System.out.println("----------修改-----------"); date.setTime(43234234238989L); s1.setName("周杰伦"); System.out.println("----------修改之后-------------"); System.out.println("s1-------------"); System.out.println(s1); System.out.println(s1.getName()); System.out.println(s1.getDate()); System.out.println(); System.out.println("s2-------------"); System.out.println(s2); System.out.println(s2.getName()); System.out.println(s2.getDate()); }}/* ----------修改之前------------s1-------------class com.bjsxt.cn.prototype.Sheep2com.bjsxt.cn.prototype.Sheep2@659e0bfd少莉Sat Feb 07 18:25:24 CST 1970
s2-------------class com.bjsxt.cn.prototype.Sheep2com.bjsxt.cn.prototype.Sheep2@4e25154f少莉Sat Feb 07 18:25:24 CST 1970----------修改---------------------修改之后-------------s1-------------com.bjsxt.cn.prototype.Sheep2@659e0bfd周杰伦Fri Jan 15 13:30:38 CST 3340
s2-------------com.bjsxt.cn.prototype.Sheep2@4e25154f少莉Sat Feb 07 18:25:24 CST 1970
* * */
/** * 测试使用序列化和反序列化实现深拷贝。 * 时间:2015年4月1日10:27:57 * 注意:记住序列化的过程。 */package com.bjsxt.cn.prototype;
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.Date;
public class Client3 { public static void main(String[] args) throws IOException, ClassNotFoundException { Date date = new Date(3234324435L); Sheep s1 = new Sheep("少莉", date); //把这个对象写入到内存中的数组。通过使用字节数组输出流baos获取内存中的一块内存 //外加一个处理流,方便操作,多态的存在,因此必须使用ObjectOutputStream类来声明。 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(s1); byte[] bytes = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); Sheep s2 = (Sheep) ois.readObject(); System.out.println("----------修改之前------------"); System.out.println("s1-------------"); System.out.println(s1.getClass()); System.out.println(s1); System.out.println(s1.getName()); System.out.println(s1.getDate()); System.out.println(); System.out.println("s2-------------"); System.out.println(s2.getClass()); System.out.println(s2); System.out.println(s2.getName()); System.out.println(s2.getDate()); System.out.println("----------修改-----------"); date.setTime(43234234238989L); s1.setName("周杰伦"); System.out.println("----------修改之后-------------"); System.out.println("s1-------------"); System.out.println(s1); System.out.println(s1.getName()); System.out.println(s1.getDate()); System.out.println(); System.out.println("s2-------------"); System.out.println(s2); System.out.println(s2.getName()); System.out.println(s2.getDate()); }}/** * * ----------修改之前------------s1-------------class com.bjsxt.cn.prototype.Sheepcom.bjsxt.cn.prototype.Sheep@33909752少莉Sat Feb 07 18:25:24 CST 1970
s2-------------class com.bjsxt.cn.prototype.Sheepcom.bjsxt.cn.prototype.Sheep@1540e19d少莉Sat Feb 07 18:25:24 CST 1970----------修改---------------------修改之后-------------s1-------------com.bjsxt.cn.prototype.Sheep@33909752周杰伦Fri Jan 15 13:30:38 CST 3340
s2-------------com.bjsxt.cn.prototype.Sheep@1540e19d少莉Sat Feb 07 18:25:24 CST 1970*/
/** * 测试new方法和clone方法的效率比较 * 通过运行结果我们可以看出,clone极大的提高了创建对象的效率。 * */package com.bjsxt.cn.prototype;
import java.util.Date;
public class Client4 { public static void testNew(int size) { long start = System.currentTimeMillis(); for (int i=0; i<size; i++) { Laptop tempLaptop = new Laptop(); } long end = System.currentTimeMillis(); System.out.println("New耗时: " + (end-start)); } public static void testClone(int size) throws CloneNotSupportedException { long start = System.currentTimeMillis(); Laptop t = new Laptop(); for (int i=0; i<size-1; i++) { Laptop temp = (Laptop) t.clone(); } long end = System.currentTimeMillis(); System.out.println("Clone耗时: " + (end-start)); } public static void main(String[] args) throws CloneNotSupportedException { testNew(1000); testClone(1000); }}
class Laptop implements Cloneable{ public Laptop() { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected Object clone() throws CloneNotSupportedException { //通过增加的这几行实现浅复制 Object object = super.clone(); return object; } }
/* * New耗时: 10550 Clone耗时: 10 * */
相关文章推荐
- 233_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_原型模式_prototype_浅复制_深复制_反序列化实现深复制
- GOF23设计模式之责任链模式(chain of responsibility)之实现
- GOF23设计模式之状态模式的理解与实现
- 设计模式GOF23之单例模式实现
- GOF23设计模式之迭代器模式理解与实现
- GOF23设计模式之静态代理模式实现之经典
- GOF23设计模式之享元模式的实现
- 【GOF23设计模式】_命令模式_数据库事务机制底层架构实现_撤销和回复JAVA246
- GOF23设计模式之策略模式与实现
- GOF23设计模式之模板方法模式(方法回调)的理解与实现之经典
- GOF23设计模式之抽象工厂模式的实现
- 【GOF23设计模式】_中介者模式_同事协作类_内部类实现JAVA245
- GOF23设计模式之组合模式之实现
- GOF23设计模式之外观模式不使用外观模式的实现
- 【GOF23设计模式】原型模式
- 【GOF23设计模式】_原型模式JAVA233-234
- GOF 23 设计模式之 原型模式(prototype) 深复制与浅复制举例
- GOF23设计模式之动态代理模式实现之经典
- GOF23设计模式之中介者模式的实现
- 设计模式C++实现(5)——原型模式、模板方法模式