关于原型模式的看法和疑问

原型模式调用(具体代码在jdon网站设计模式原型模式):

AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = (AbstractSpoon) spoon.clone();

System.out.println(spoon2.getSpoonName());

原型模式要先new一个对象出来,再利用这个对象"生出"一个自己的克隆。
这种创建对象方式怎么看都有一段代码是多余的,给我感觉挺无聊的。

结合工厂模式后的调用:

String className = "com.patterns.newprototype.SoupSpoon";

AbstractSpoon spoon = SoupSpoonFactory.getSpoon(className);
SpoonInterface spoon2 = (SpoonInterface) spoon.clone();

System.out.println(spoon2.getString());

//---------------------------------------------------------
public interface SpoonInterface {

public String getString();
}
//---------------------------------------------------------
public class SoupSpoonFactory {

public static AbstractSpoon getSpoon(String className) {

AbstractSpoon spoon = null;

try {

spoon = (AbstractSpoon) Class.forName(className).newInstance();

} catch(Exception er) {


}

return spoon;
}
}


public class SoupSpoon extends AbstractSpoon implements SpoonInterface {

public SoupSpoon() {

setSpoonName("中文的SoupSpoon!");
}

public String getString() {

return "打印SoupSpoon";
}

}

第二种:这么写主要是因为后面的看上去较好看,但感觉SoupSpoon之类的子类用了继承和接口实现;设计上可能有些幼稚;又好像在偶合性方面差了点。

第一种:似乎在应用中也不知道他有什么好处,有懂的道友指教一下。模式刚入门没什么经验.


[该贴被X.Underset于2008-03-15 01:21修改过]

>似乎在应用中也不知道他有什么好处
原型模式可以从字面上理解:就是原封不动地创造一个对象。注意原封不动这个形容词,实际是拷贝一份,至于拷贝方式则可以各种方式,如使用J2SE的clone或自己使用new,然后定制转移数据等等,都可以。

我的理解,不知道对否:
你需要有一个对象是所有人可以访问的,部分人可以修改的。在访问时访问者要求对象保持不变。而修改者却要修改这个对象。为性能采用克隆对象应该是比较科学的。在使用缓存机制的时候有许多这类例子的。

>你需要有一个对象是所有人可以访问的,部分人可以修改的
从这个方向去理解有失偏颇,应该从对象如何创建这个方向去理解,至于这个对象创建后如何被访问,是所有人访问,还是部分人可以修改,不是原型模式关心的。

先有创建,才有访问,先有你我生命,才有我们今天这里互相访问讨论。