在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("!=");
}
}
}
分享到:
相关推荐
《设计模式之蝉》这本书可能是对设计模式的一种形象化描述,或是以蝉为比喻来讲解设计模式的概念。蝉在地下蛰伏多年,最终破土而出,仅生活在地面上的几周时间。这一生命周期与设计模式的持久价值有异曲同工之妙,即...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
人人都懂设计模式 设计模式是软件开发中的一种解决方案,它提供了一种通用的设计思想和方法论,可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中...
设计模式之《大话设计模式》.pptx
《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...
设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...
这个压缩包文件"设计模式(包含5个设计模式)含源代码报告.rar"显然是一份宝贵的资源,它涵盖了五个核心的设计模式,并附带了详细的类图、源代码以及文档报告,这对于学习和理解设计模式至关重要。 首先,我们要探讨...
设计模式之禅,一种思想书,会一直受益,初学,工作一年,三年认识都不一样。 也算是软件开发的思想启蒙,看书介绍说:能让你设计一个优秀的代码结构,写一段健壮的代码,比较容易的解决一些复杂的需求。
软件设计模式(Java版)习题答案 本资源为软件设计模式(Java版)习题答案,由程细柱编著,人民邮电出版社出版。该资源涵盖了软件设计模式的基础知识,包括软件设计模式的概述、UML中的类图、面向对象的设计原则、...
第二部分是核心部分,通过一步步完善的代码示例,由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、...
设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计已经逐渐成为软件开发和维护过程中的一个重要课题。 Python设计模式(第2版)通过11章内容,全面揭示有关设计模式的内容,并结合Python语言进行示例...
设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏完美开发 设计模式与游戏...
本资源为一份完整的软件设计模式大作业,涵盖了六种设计模式的应用,分别是简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式和观察者模式。该大作业的主要内容包括系统流程、系统类图、各个模式的子类图、...
课后习题参考答案部分涵盖了书中各个章节的关键知识点,包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式)、结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)...
2. **基础性**:有些J2EE设计模式实际上是建立在某些软件开发设计模式之上的。 3. **影响性**:软件开发设计模式为J2EE设计模式提供了坚实的基础,其应用将直接影响整个结构的稳定性和可扩展性。 #### 五、设计模式...
全书用两章篇幅对设计模式和GRASP作了基本介绍,3种设计模式的讲解:对于每一种模式,先给出定义,接着通过类比方式用一个现实世界中的例子说明模式的应用,然后分别以C#和Java代码例述模式的架构实现。最后一章给出...
设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...