原始模型模式(PROTOTYPE)

[size=large]原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。


原始模型模式最成功的应用之一就是Object类的clone方法,可能由于这种方法的存在,很多人没有意识到原始模型模式是一种特定的创建模式。但是,它的确是一种产生对象的模式,而且clone方法所实现的只是原始模型模式的一种情况。
原始模型模式的对象创建方式有两种,可以分别称为浅复制和深复制:浅复制就是从原对象复制出新的对象时,并不复制它的成员对象,即它的成员对象句柄所指向的还是原对象中的成员对象;深复制就是在新对象中,成员对象也是新的。
Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
package prototype;

public interface Prototype ...{

public void printPart();

Object flatClone();

Object deepClone() throws Exception;

}


package prototype;

import Java.io.*;

public class ConcretePrototype implements Prototype , Serializable...{

private Part part;

public ConcretePrototype() ...{
part = new Part();
}

public void printPart() ...{
System.out.println(part);
}


public Object flatClone() ...{
ConcretePrototype cp = new ConcretePrototype();
cp.part = this.part;
return cp;
}


public Object deepClone() throws Exception ...{
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());
}

class Part implements Serializable ...{

}

}


package prototype;

public class Client ...{

public static void main(String[] args) throws Exception ...{
ConcretePrototype originate, cloned, deepCloned;
originate = new ConcretePrototype();

Thread.sleep(2000);

cloned = (ConcretePrototype)originate.flatClone();
deepCloned = (ConcretePrototype)originate.deepClone();
System.out.println(originate);
System.out.println(cloned);
System.out.println(deepCloned);
originate.printPart();
cloned.printPart();
deepCloned.printPart();
}

}


下面是这段代码的打印:

prototype.ConcretePrototype@1034bb5
prototype.ConcretePrototype@19efb05
prototype.ConcretePrototype@723d7c
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@22c95b

可以看出,打印的前三行各不相同,这说明通过浅复制和深复制,所得到的对象都是与原对象不同的;打印的后三行中有两行相同,这说明,在浅复制时,成员对象的实体没有被复制,只是复制了其句柄,而深复制时,成员对象的实体也被复制了。

资料引用:http://www.knowsky.com/361977.html[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值