`
tigers20010
  • 浏览: 48593 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java原型模式(clone)之疑惑???

阅读更多

      近期在javaeye看到一位兄弟写的java原型模式之理解。然后,自己就写了个demo,但是在使用colone时,好像出现了些问题??

 

定义如下几个类:

 

public class BtripApplication implements Cloneable{
 
   private int a;

public int getA() {
 return a;
}

public void setA(int a) {
 this.a = a;
}
  
public BtripApplication clone() throws CloneNotSupportedException {
 return (BtripApplication)super.clone();
}
}

------------------------------------------------------------------------------------------------------------------------

 

public class BtripRevision implements Cloneable {
 
  private BtripApplication btripApplication;
 
  public BtripRevision(BtripApplication btripApplication){
   this.btripApplication =  btripApplication;
  }
 
public BtripApplication getBtripApplication() {
 return btripApplication;
}
public void setBtripApplication(BtripApplication btripApplication) {
 this.btripApplication = btripApplication;
}

public BtripRevision clone() throws CloneNotSupportedException {
 return (BtripRevision)super.clone();
}
}

---------------------------------------------------------------------------------------------------------------------

public class TestBtripApplicationRevision {
  public static void main(String args[]) throws CloneNotSupportedException{
   BtripApplication b1 = new BtripApplication();
   b1.setA(1);
   BtripRevision b2 = new BtripRevision(b1);
   BtripRevision b3 =  b2.clone();
   //b3.getBtripApplication().setA(3);
   b1.setA(3);
   System.out.println("b2="+b2.getBtripApplication().getA());
   System.out.println("b3="+b3.getBtripApplication().getA());
   System.out.println("b2="+b2+"--------b3="+b3);
  }
}

 

输出的结果为:b2=3
                    b3=3

为什么结果不是b2=1,b3=3呢???

0
1
分享到:
评论
5 楼 z276356445t 2010-12-13  
刚刚我也看了下这个原型设计模式,就你目前的情况来看,你是用的浅拷贝吧,如果要深拷贝的话,你的成员变量必须也要重新拷贝一个,然而在你客户端进行引用的时候只能对你拷贝的对象进行赋值才能达到你理想的结果,你可以这样改.
public BtripRevision clone() throws CloneNotSupportedException {
this.btripApplication = (BtripApplication)this.btripApplication.clone();
return (BtripRevision) super.clone();
}

客户端应该这样去访问:
public static void main(String args[]) throws CloneNotSupportedException {
BtripApplication b1 = new BtripApplication();
b1.setA(1);
BtripRevision b2 = new BtripRevision(b1);
BtripRevision b3 = b2.clone();
// b3.getBtripApplication().setA(3);
b1.setA(3);
b3.setBtripApplication(b1);
System.out.println("b2=" + b2.getBtripApplication().getA());
System.out.println("b3=" + b3.getBtripApplication().getA());
System.out.println("b2=" + b2 + "--------b3=" + b3);
}
4 楼 tigers20010 2010-06-25  
mercyblitz 写道
tigers20010 写道
mercyblitz 写道
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。


在调用b2.clone()时,没有调用b1的clone方法???也就是说,在调b2.clone()时,必然要进行b1的copy,难道b1没有进行深拷贝??



恩,这个时候b2和b3引用了同一个b1。

clone并没有深入下去。没有生成一个新的b1。


现在我想b2.clone()时,b1也要进行深拷贝?(项目中有这种类似的需求,当时我是在每个modle里,写了个selfcopy()的方法,进行一一赋值的,想想真够麻烦的)。后来我将public BtripRevision clone() throws CloneNotSupportedException {
return (BtripRevision)super.clone();
}
改为public BtripRevision clone() throws CloneNotSupportedException {
  btripApplication.clone();
return (BtripRevision)super.clone();
}也不行啊,不知道是为何?感觉那位老兄讲的原型模式,不是太清楚额?
3 楼 mercyblitz 2010-06-25  
tigers20010 写道
mercyblitz 写道
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。


在调用b2.clone()时,没有调用b1的clone方法???也就是说,在调b2.clone()时,必然要进行b1的copy,难道b1没有进行深拷贝??



恩,这个时候b2和b3引用了同一个b1。

clone并没有深入下去。没有生成一个新的b1。
2 楼 tigers20010 2010-06-25  
mercyblitz 写道
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。


在调用b2.clone()时,没有调用b1的clone方法???也就是说,在调b2.clone()时,必然要进行b1的copy,难道b1没有进行深拷贝??
1 楼 mercyblitz 2010-06-25  
引用
   BtripRevision b2 = new BtripRevision(b1);

引用
b1.setA(3);


传递了b1对象引用,哪么b1也会相应的变化。

相关推荐

    java 原型模式

    总结起来,Java原型模式通过`Cloneable`接口和`clone()`方法提供了一种快速创建对象的方式,尤其适用于那些创建过程复杂或需要频繁复制对象的情况。然而,使用时要注意深拷贝和浅拷贝的区别,并根据实际情况处理对象...

    Java原型模式

    在Java中,原型模式通过实现Cloneable接口和覆盖clone()方法来复制对象,避免了使用构造函数进行深度复制的复杂性。接下来我们将深入探讨Java原型模式的核心概念、实现方式以及实际应用。 ### 核心概念 1. **原型...

    设计模式之原型模式Java实现和类设计图

    在Java中实现原型模式,首先需要让原型类实现`Cloneable`接口,并重写`clone()`方法。以下是一个简单的示例: ```java public class Prototype implements Cloneable { private String property; public ...

    详解JAVA 原型模式

    【Java原型模式详解】 原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目标是通过复制现有的对象来创建新对象,以减少重复的构造过程,提高性能。在Java中,原型模式通常涉及到对象的克隆操作,即...

    原型模式实践代码

    在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式实践代码"中,我们可以预期看到如何在实际编程中应用这一模式。 在Java中,`Cloneable`接口是...

    设计模式之原型模式

    原型模式是设计模式中的一种,它是Java 23种经典设计模式之一,主要用来提高对象创建的效率。在原型模式中,我们通过复制或克隆一个已经存在的对象来创建新的对象,而不是通过构造函数来创建。这种方法尤其适用于当...

    Java 23种设计模式08原型模式.pdf

    ### Java设计模式之原型模式深度解析 #### 模式动机 在面向对象编程的世界里,对象的创建往往伴随着复杂的逻辑处理。特别是在某些场景下,对象的构造过程可能涉及大量资源的消耗,例如数据库连接、文件读写等。在...

    Java设计模式-原型模式详解

    原型模式是 Java 设计模式之一,它用于创建对象时,指定创建对象的类型,并通过拷贝这些原型创建新的对象。该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的...

    java设计模式之原型模式

    **Java设计模式之原型模式详解** 原型模式(Prototype Pattern)是设计模式中的一种结构型模式,主要用于快速创建对象。在Java中,它基于对象克隆的概念,允许我们复制已有对象而不必再次创建新实例,从而降低系统...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    android设计模式之原型模式

    这个抽象类声明了一个`clone()`方法,它是原型模式的核心,用于创建与原对象相同的新对象。由于Java的`clone()`方法是受保护的,所以我们需要在子类中重写它,并将其公开。 然后,创建一个具体的原型类...

    设计模式——原型模式

    在Java中,实现原型模式主要有两种方式:浅复制和深复制。浅复制只是复制对象本身,如果对象中包含引用类型的成员变量,那么只复制引用,不复制引用的对象。深复制则是不仅复制对象本身,还递归复制对象中的所有引用...

    原型模式PPT文档

    在Java中,原型模式通常通过实现`Cloneable`接口来实现。`Cloneable`接口表明一个对象可以被复制。当一个类实现了这个接口,我们就可以调用`Object`类中的`clone()`方法来复制该对象。但是,需要注意的是,`clone()`...

    通过java实现原型模式(Prototype Pattern).rar

    在Java中,原型模式通常通过实现一个原型接口或抽象类,并在具体类中提供克隆方法来实现。Java中有一个内置的Cloneable接口和Object类的clone()方法,它们可以被用来实现对象的克隆。但是,直接使用clone()方法需要...

    设计模式的原型模式的例子

    在Java、C#等面向对象语言中,原型模式通常依赖于语言提供的克隆功能。例如,在Java中,一个类如果要实现Cloneable接口并重写`clone()`方法,就可以成为可被克隆的对象。下面我们将深入探讨原型模式的实现和应用场景...

    创建型模式之原型模式(Prototype Pattern)

    - 在Java中,实现原型模式可以通过实现`Cloneable`接口并重写`Object`类的`clone()`方法来完成。但是需要注意的是,`clone()`方法默认是浅拷贝,若需要实现深拷贝,需要自定义实现。 - 在Python等语言中,可以直接...

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    原型模式通过复制一个已经存在的实例来创建新的实例,以避免重复的初始化操作。在JDK中的应用包括: - java.lang.Object#clone(),创建并返回此对象的副本。 e) 单例模式(Singleton) 单例模式保证一个类只有一...

    实验六:原型模式.rar

    在Java中,我们通常通过实现`Cloneable`接口和覆盖`Object`类中的`clone()`方法来实现原型模式。 1. **实现Cloneable接口**: 一个类如果想要支持克隆,必须实现`Cloneable`接口。这是一个标记接口,不包含任何...

Global site tag (gtag.js) - Google Analytics