一篇不错的文章,介绍clone()方法的

这几天一直迷惑原型模式的设计应用,现在理解了clone()方法,感觉还不错。这篇文章挺受启发,看看吧。

http://www-900.ibm.com/developerWorks/cn/java/l-jpointer/index.shtml

对 原型模式 基本就是clone方法。
IBM这个文章有点罗嗦。

java中对象赋值和基本类型赋值是不一样的,基本类型赋值就象我们通常概念一样,对象赋值实际是传递了一个引用,指向,实际是指向同一个内存,赋值者和被赋值者实际拥有同一个内存块,所以互相会影响,要实现真正的赋值,就必须clone(克隆)


在何处应该使用原型法呢?《设计模式》中说得很不清楚,我在实际应用中觉得工厂方法能使用的地方,改一改,原型法也可以使用。使用后,又想不出它好在那里?

原型法只有在需要复制对象时才有必要使用。
谈到复制对象,一般是应用在一些极其高妙的技巧里。
我好像在一个shoppingcart程序里看到过

import javax.servlet.http.HttpServletRequest;
import java.util.Hashtable;
import java.util.Enumeration;
public class BasketBean {
/* 当前购物蓝中的商品,这里是用Hashtable来储存 */
private Hashtable products_ = new Hashtable();
/* 这是个计算购物蓝中总价的方法 */
public double getTotal() {…}
/*这是一个获得某个商品的价格的方法 */
public double getPounds(Product p_in_inv) {…}

/*调整刷新当前购物蓝中的内容,这种情况发生在客户在检查购物车中的内容时,可能有所增改。 */
public void savePurchases(HttpServletRequest request) {
//首先得到库存商品清单
Product[] products = InventoryBean.getCatalogue();
//从前台获得用户购买本商品的数量
String[] lbValues = request.getParameterValues("pounds");
if (lbValues != null) {
//清除本购物蓝中原来的内容
products_.clear();
for (int i = 0; i < lbValues.length; i++) {
double lbs = Double.parseDouble(lbValues);
if(lbs > 0) {
//从库存商品清单中 复制一份商品出来
Product p =(Product)products.clone();
//改变这个商品的数量为用户输入的数量
p.setPounds(lbs);
//将这个商品放入本购物蓝中
products_.put(Integer.toString(p.getSKU()), p);
}
}
}
}
}

你的例子真是太完美了!我基本上知道clone用在哪里了。比如像定制论坛,或是定制表单这样的,是不是用clone也很好用呢?

clone方法对于大的对象 如论坛等,进行克隆好像不是很适合,
clone方法有个影子克隆,要深度克隆又比较麻烦,所以除非不得已,其他创建型模式可以先考虑。

克隆小的对象的确好用,克隆出来的对象最好不要包含其他对象。这个模式中原型管理器很重要,可以利用单态。

商品、乐谱、迷宫都可以用克隆的,还有什么其他的地方可以使用么?

你想要克隆时就克隆。

未来有了克隆技术后,你想克隆自己任何时候都可以。
呵呵 开玩笑