原型模式:
他是一种创建型模式,是原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。允许从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。
原型模式的参与者:抽象原型类(Prototype),具体原型类(ConcretePrototype),客户(Client)。
抽象原型类:申明一个克隆自身的接口,给具体原型类所需的接口。
具体原型类:实现了一个克隆自身的操作。
客户:让一个原型类实现从自身克隆出一个新的对象。
原型模式最困难的部分在于怎么实现具体原型类里的克隆方法。但对象结构包含循环引用时,这极为棘手。大多数对克隆对象提供了一些支持。克隆包括浅克隆和深克隆。
浅克隆:拷贝的对象与原来的对象是共享指针的。当对象克隆后,若原对象中含有引用类型,只要原来的对象中的引用类型发生变化,克隆后的对象中的引用类型也会发生相应的变化。
深克隆:拷贝之后的对象是一个新的指针,原对象的改变不会影响拷贝之后的对象。
java的所有类都是从java.lang.Object类继承而来的。而Object类提供了对对象的复制的方法:protected Object clone();子类可以把这个方法给覆盖掉,提供满足自己要求的复制方法。java语言还提供了一个Cloneable接口。其起一个标志作用,如果所考虑的类没有实现该接口,则调用Clone()方法时会出现CloneNotSupportException异常。
在Java中通过实现Cloneable接口和用java.lang.Object中的Clone()方法来实现克隆只能实现浅克隆。怎样让其成为深克隆呢?若系统中的对象提供了Save和Load操作,那么只需要用Save操作将对象暂时保存到内存缓存区,用Load操作从该缓存区重构该对象来创建一个复本,这样就能实现深克隆。在Java语言中深克隆一个对象常常可以先把对象实现Serializable接口,然后把对象写到一个流中,然后再从这个流中读取出来。Java中可以用ObjectOutputStream--ByteArrayOutputStream写入到内存中,然后通过ByteArrayInputStream--ObjectOutputStream读取对象。获得的对象是复制后的对象。