`
andy99
  • 浏览: 7820 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式之Pototype

阅读更多
在java语言中,当我们在传递参数时,如是是个对象,我们并不想在在方法中改变对象的值,那么我们该怎么办:
1,可以new 一个对象,然后再setXXX(getXXX())来给对象赋值,如果要产生N个,比如N是100,如果这个对象有N个属性,比如10个,这样就要new100次,get,set 1000次。这样工作是相当无聊的,而且无意义。
2,采用Object的clone()方法,也就是复制对象,需实现Cloneable接口否则会抛出CloneNotSupportedException异常代码如下:
可是,如果当该对象的属性不是基本数据类型的是,如是某个对象,该对象的属性与原对象的属性是同一个,即引用指向同一个对象,在堆内存中并没有为该属性开辟一块新的内存。
为解决此问题,我们来谈谈,浅复制,和深复制。
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
如下java代码:
public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍,如下java代码:
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());
}
下面我给下有关代码及注释:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.Serializable;
/*
 * 1.使用Prototype模式的一个好处就是可以节省大量的接口实现类的编写。
 * 采用工厂模式的话,如果分别为用户指定的每种场合都提供一个用户接口
 * 工厂类,将会为我们带来繁重的工作量。未来避免用户接口工厂类不断增
 * 加,可以考虑使用Prototype模式。
 * 2.而Prototype模式的一个致命的缺点是:Java中的原型方法不允许新对
 * 象拥有与父对象不同的方法。这时候,在使用原型方法之前,需要仔细考
 * 虑原型方法的利弊,甚至要试一下Prototype模式是否满足需求。
 * 3.综上所述:Prototype模式最适用的场合应该是:当几个对象的类仅在
 * 属性上存在一点差异,而行为上完全相同时。可以在复制一个原型对象后,
 * 对其属性进行细小的微调,从而实现定制化的目的。
 * */
public class BookBean implements Cloneable,Serializable {
	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	/*
	 * 深克隆需要使用Java中提供的
	 * 对象串行化功能-即把要复制
	 * 的对象写入到一个缓冲流,然
	 * 后通过输入流读入,完成对象
	 * 的复制
	 * */
	public Object deepClone() throws IOException, OptionalDataException,
			ClassNotFoundException {
try {
			   // 在内存中开辟一块缓冲区,用于将自身写入
			   ByteArrayOutputStream bos = new ByteArrayOutputStream();
			   ObjectOutputStream out = new ObjectOutputStream(bos);
			   // 通过Serialization机制将自身写入缓冲区
			   out.writeObject(this);
			   out.close();
			   / /读
			   ByteArrayInputStream bis = new ByteArrayInputStream(bos
			     .toByteArray());
			   ObjectInputStream in = new ObjectInputStream(bis);
			   // 将刚才写入的内容读入一个新的对象
			    Object ret = in.readObject();
			   in.close();
			   // 返回对象
			   return ret;
			  } catch (Exception e) {
			   e.printStackTrace();
			   return null;
			  }
	}
}
下面是一个测试类:
public class TestPrototype {
	public static void main(String args[]) throws Exception{
		BookBean book=new BookBean();
		book.setId(1);
		book.setName("java设计模式");
		System.out.println(book.getId()+","+book.getName());
		BookBean book2=(BookBean)book.deepClone();
		System.out.println(book2.getId()+","+book2.getName());
		if(book==book2){
			System.out.println("==");
		} else {
			System.out.println("!=");
		}
		if(book.getId()==book2.getId()){
			System.out.println("==");
		}else {
			System.out.println("!=");
		}
		if(book.getName()==book2.getName()){
			System.out.println("==");
		}else {
			System.out.println("!=");
		}
		
	}
}
2
0
分享到:
评论

相关推荐

    设计模式之蝉

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

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

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

    Java设计模式之禅

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

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

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

    设计模式之《大话设计模式》.pptx

    设计模式之《大话设计模式》.pptx

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

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

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

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

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

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

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

    python设计模式第2版.pdf

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

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...

    设计模式与游戏完美开发

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

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    课后习题参考答案部分涵盖了书中各个章节的关键知识点,包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式)、结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)...

    Head First设计模式.pdf

    全书用两章篇幅对设计模式和GRASP作了基本介绍,3种设计模式的讲解:对于每一种模式,先给出定义,接着通过类比方式用一个现实世界中的例子说明模式的应用,然后分别以C#和Java代码例述模式的架构实现。最后一章给出...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    C++设计新思维:泛型编程与设计模式之应用.pdf 带目录书签

    C++设计新思维:泛型编程与设计模式之应用.pdf 带目录书签

    设计模式文档 chm

    设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...

    设计模式大作业.zip

    在“设计模式大作业.zip”这个压缩包中,我们看到了一系列使用了多种设计模式实现的代码示例,这包括简单工厂模式、工厂方法模式、单例模式、门面模式以及策略模式。接下来,我们将深入探讨这些设计模式及其在实际...

Global site tag (gtag.js) - Google Analytics