`

设计模式之Pototype

阅读更多

文章转自:http://zhanghuifeng.iteye.com/blog/397320

java语言中,当我们在传递参数时,如是是个对象,我们并不想在在方法中改变对象的值,那么我们该怎么办:
1,可以new 一个对象,然后再setXXX(getXXX())来给对象赋值,如果要产生N个,比如N是100,如果这个对象有N个属性,比如10个,这样就要new100次,get,set 1000次。这样工作是相当无聊的,而且无意义。
2,采用Object的clone()方法,也就是复制对象,需实现Cloneable接口否则会抛出CloneNotSupportedException异常代码如下:
可是,如果当该对象的属性不是基本数据类型的是,如是某个对象,该对象的属性与原对象的属性是同一个,即引用指向同一个对象,在堆内存中并没有为该属性开辟一块新的内存。
为解决此问题,我们来谈谈,浅复制,和深复制。
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
如下java代码:

Java代码 复制代码
  1. public Object clone() {   
  2.         try {   
  3.             return super.clone();   
  4.         } catch (CloneNotSupportedException e) {   
  5.             // TODO Auto-generated catch block   
  6.             e.printStackTrace();   
  7.             return null;   
  8.         }   
  9.     }  
public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍,如下java代码:

Java代码 复制代码
  1. public Object deepClone() throws IOException, OptionalDataException,   
  2.             ClassNotFoundException {   
  3.         ByteArrayOutputStream bo = new ByteArrayOutputStream();   
  4.         ObjectOutputStream oo = new ObjectOutputStream(bo);   
  5.         oo.writeObject(this);    
  6.         ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());   
  7.         ObjectInputStream oi = new ObjectInputStream(bi);   
  8.         return (oi.readObject());   
  9. }  
public Object deepClone() throws IOException, OptionalDataException,
			ClassNotFoundException {
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(this); 
		ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
		ObjectInputStream oi = new ObjectInputStream(bi);
		return (oi.readObject());
}

下面我给下有关代码及注释:

Java代码 复制代码
  1. import java.io.ByteArrayInputStream;   
  2. import java.io.ByteArrayOutputStream;   
  3. import java.io.IOException;   
  4. import java.io.ObjectInputStream;   
  5. import java.io.ObjectOutputStream;   
  6. import java.io.OptionalDataException;   
  7. import java.io.Serializable;   
  8. /*  
  9.  * 1.使用Prototype模式的一个好处就是可以节省大量的接口实现类的编写。  
  10.  * 采用工厂模式的话,如果分别为用户指定的每种场合都提供一个用户接口  
  11.  * 工厂类,将会为我们带来繁重的工作量。未来避免用户接口工厂类不断增  
  12.  * 加,可以考虑使用Prototype模式。  
  13.  * 2.而Prototype模式的一个致命的缺点是:Java中的原型方法不允许新对  
  14.  * 象拥有与父对象不同的方法。这时候,在使用原型方法之前,需要仔细考  
  15.  * 虑原型方法的利弊,甚至要试一下Prototype模式是否满足需求。  
  16.  * 3.综上所述:Prototype模式最适用的场合应该是:当几个对象的类仅在  
  17.  * 属性上存在一点差异,而行为上完全相同时。可以在复制一个原型对象后,  
  18.  * 对其属性进行细小的微调,从而实现定制化的目的。  
  19.  * */  
  20. public class BookBean implements Cloneable,Serializable {   
  21.     private Integer id;   
  22.     private String name;   
  23.   
  24.     public Integer getId() {   
  25.         return id;   
  26.     }   
  27.   
  28.     public void setId(Integer id) {   
  29.         this.id = id;   
  30.     }   
  31.   
  32.     public String getName() {   
  33.         return name;   
  34.     }   
  35.   
  36.     public void setName(String name) {   
  37.         this.name = name;   
  38.     }   
  39.   
  40.     public Object clone() {   
  41.         try {   
  42.             return super.clone();   
  43.         } catch (CloneNotSupportedException e) {   
  44.             // TODO Auto-generated catch block   
  45.             e.printStackTrace();   
  46.             return null;   
  47.         }   
  48.     }   
  49.     /*  
  50.      * 深克隆需要使用Java中提供的  
  51.      * 对象串行化功能-即把要复制  
  52.      * 的对象写入到一个缓冲流,然  
  53.      * 后通过输入流读入,完成对象  
  54.      * 的复制  
  55.      * */  
  56.     public Object deepClone() throws IOException, OptionalDataException,   
  57.             ClassNotFoundException {   
  58. try {   
  59.                // 在内存中开辟一块缓冲区,用于将自身写入   
  60.                ByteArrayOutputStream bos = new ByteArrayOutputStream();   
  61.                ObjectOutputStream out = new ObjectOutputStream(bos);   
  62.                // 通过Serialization机制将自身写入缓冲区   
  63.                out.writeObject(this);   
  64.                out.close();   
  65.                / /读   
  66.                ByteArrayInputStream bis = new ByteArrayInputStream(bos   
  67.                  .toByteArray());   
  68.                ObjectInputStream in = new ObjectInputStream(bis);   
  69.                // 将刚才写入的内容读入一个新的对象   
  70.                 Object ret = in.readObject();   
  71.                in.close();   
  72.                // 返回对象   
  73.                return ret;   
  74.               } catch (Exception e) {   
  75.                e.printStackTrace();   
  76.                return null;   
  77.               }   
  78.     }   
  79. }   
  80. 下面是一个测试类:   
  81. public class TestPrototype {   
  82.     public static void main(String args[]) throws Exception{   
  83.         BookBean book=new BookBean();   
  84.         book.setId(1);   
  85.         book.setName("java设计模式");   
  86.         System.out.println(book.getId()+","+book.getName());   
  87.         BookBean book2=(BookBean)book.deepClone();   
  88.         System.out.println(book2.getId()+","+book2.getName());   
  89.         if(book==book2){   
  90.             System.out.println("==");   
  91.         } else {   
  92.             System.out.println("!=");   
  93.         }   
  94.         if(book.getId()==book2.getId()){   
  95.             System.out.println("==");   
  96.         }else {   
  97.             System.out.println("!=");   
  98.         }   
  99.         if(book.getName()==book2.getName()){   
  100.             System.out.println("==");   
  101.         }else {   
  102.             System.out.println("!=");   
  103.         }   
  104.            
  105.     }   
  106. }  
分享到:
评论

相关推荐

    设计模式之蝉

    《设计模式之蝉》这本书可能是对设计模式的一种形象化描述,或是以蝉为比喻来讲解设计模式的概念。蝉在地下蛰伏多年,最终破土而出,仅生活在地面上的几周时间。这一生命周期与设计模式的持久价值有异曲同工之妙,即...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    人人都懂设计模式 人人都懂设计模式

    人人都懂设计模式 设计模式是软件开发中的一种解决方案,它提供了一种通用的设计思想和方法论,可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中...

    Head First 设计模式 +Java设计模式(第2版)

    《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...

    GOF设计模式中英文+设计模式精解中英文

    GOF(Gang of Four)设计模式,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位专家在他们的著作《设计模式:可复用面向对象软件的基础》中提出,被誉为设计模式的经典之作。本资源包含了GOF设计...

    设计模式之禅电子版(百度网盘下载【包含链接与提取码】)

    设计模式之禅,一种思想书,会一直受益,初学,工作一年,三年认识都不一样。 也算是软件开发的思想启蒙,看书介绍说:能让你设计一个优秀的代码结构,写一段健壮的代码,比较容易的解决一些复杂的需求。

    设计模式(包含5个设计模式)含源代码报告.rar

    这个压缩包文件"设计模式(包含5个设计模式)含源代码报告.rar"显然是一份宝贵的资源,它涵盖了五个核心的设计模式,并附带了详细的类图、源代码以及文档报告,这对于学习和理解设计模式至关重要。 首先,我们要探讨...

    软件设计模式(java版)习题答案.pdf

    软件设计模式(Java版)习题答案 本资源为软件设计模式(Java版)习题答案,由程细柱编著,人民邮电出版社出版。该资源涵盖了软件设计模式的基础知识,包括软件设计模式的概述、UML中的类图、面向对象的设计原则、...

    基于Java的设计模式大作业绘图系统【六种设计模式+文档】.zip

    本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...

    新版设计模式手册 - C#设计模式(第二版)

    设计模式是解决软件开发中常见问题的经验总结,是软件工程的最佳实践之一。本手册将详细阐述23种经典设计模式,并结合C#语言特性,给出具体实现和应用示例。 首先,我们来了解一下设计模式的基本概念。设计模式是...

    JavaScript设计模式与开发实践.pdf

    第二部分是核心部分,通过一步步完善的代码示例,由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、...

    python设计模式第2版.pdf

    设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计已经逐渐成为软件开发和维护过程中的一个重要课题。 Python设计模式(第2版)通过11章内容,全面揭示有关设计模式的内容,并结合Python语言进行示例...

    六种微服务架构的设计模式.pdf

    在这篇文章中,我们将探讨六种常见的微服务架构设计模式:聚合器微服务设计模式、代理微服务设计模式、链式微服务设计模式、分支微服务设计模式、数据共享微服务设计模式和异步消息传递微服务设计模式。 聚合器...

    设计模式之我见源代码

    "设计模式之我见源代码"系列是作者分享的设计模式实践和理解,通过源代码的形式帮助读者深入理解和应用设计模式。 在提供的压缩包文件中,我们看到几个关键的目录和文件: 1. `.classpath`:这是一个Eclipse项目...

    软件设计模式大作业

    本资源为一份完整的软件设计模式大作业,涵盖了六种设计模式的应用,分别是简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式和观察者模式。该大作业的主要内容包括系统流程、系统类图、各个模式的子类图、...

    设计模式与游戏完美开发

    设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏...

Global site tag (gtag.js) - Google Analytics