论坛首页 Java企业应用论坛

晒晒clone()方法

浏览 3173 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (9)
作者 正文
   发表时间:2008-12-23   最后修改:2008-12-23

先看一个原型(prototype)模式的例子:

 

定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.

 

    这个是一个使用勺子的方法:

 

package com.sui.protoType;

public class SaladSpoon extends AbstractSpoon{
	
	public SaladSpoon(){
		setSpoonName("Salad spoon");
	}
}

 

   这个是一个使用勺子的另一个方法:

package com.sui.protoType;

public class SoupSpoon extends AbstractSpoon{

	public SoupSpoon(){
		setSpoonName("soup spoon");
	}
	
}

 

    运行下面这个类:

package com.sui.protoType;

public class AbstractSpoon implements Cloneable {

    String spoonName;

    public String getSpoonName() {
        return spoonName;
    }

    public void setSpoonName(String spoonName) {
        this.spoonName = spoonName;
    }

    public Object clone() {
        Object object = null;
        try {
            object = super.clone();
        } catch (CloneNotSupportedException e) {
            
            System.err.println("AbstractSpoon is not Cloneable");
        }
        return object;
    }

    public static void main(String[] args) {
        AbstractSpoon soup = new SoupSpoon();
        System.out.println(soup.spoonName);
        AbstractSpoon saland = new SaladSpoon();
        System.out.println(saland.spoonName);
    }
}

 

  最后输出:

soup spoon
Salad spoon

 

 很容易发现这段代码和我们经常使用的多了一个clone()方法,可以这么说原型模式是clone()方法的"独场秀".有一点值得注意的是:去掉clone()方法.程序照常运行.这样就有疑问了:clone()方法是否值得使用?

 

另一个需要注意的是clone()方法在原型模式中的作用其实就是在处理"值传递"和"引用传递"两者不同结果上的.

 

在反复实验之后觉得clone()方法很难"恭维".

 

想请教诸位:

其一:是否有更好的方法来实现:使用一个对象再创建另外一个可定制的对象.即给原型模式脱胎换骨;

其二:在处理"值传递"和"引用传递"问题上是否有更简便的方法;

其三:clone()方法到底有多大利用价值?

 

 

 

   发表时间:2008-12-24   最后修改:2008-12-24
首先。
楼主你看的是Jdon的设计模式对不对?
并且你只是格式化了一下。。。
所以,改改你的标题,不是自己创作的别晒。小心管理员关你小黑屋。

你代码的问题:
1.首先你定义了get/set方法。为什么把spoonName变为private作用域?并且你还无视你的get/set方法,直接调用属性。jdon写的只是个例子,但你要有良好的习惯。

2.你的main方法是要说明什么问题?你定义了clone,却不调用。难道JAVA自动给你识别脑电波?

你想clone方法生效:

     public static void main(String[] args) {  
         AbstractSpoon soup = new SoupSpoon();  
         System.out.println(soup.getSpoonName());  
         AbstractSpoon cloneSpoon = soup.clone();  
         System.out.println(cloneSpoon.getSpoonName());  
     }  


jdon的内容中给了一个链接。。。你却没去点击。。。
http://www-128.ibm.com/developerworks/cn/java/l-jpointer/index.html

0 请登录后投票
   发表时间:2009-05-09  
说实话,不知所云,不知道你的clone方法覆盖后起什么作用呢?!
0 请登录后投票
   发表时间:2009-05-09  
很诡异的一篇文章 看到三遍 竟然不知道楼主要说啥...
0 请登录后投票
   发表时间:2009-05-09  
这种文章也来凑数,做技术的都这么浮躁!!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics