5.3.2 代码实现
代码注解
Java的java.lang.Object方法里就提供了克隆方法clone(),原则上似乎所有类都拥有此功能,但其实不然,关于它的使用有如下限制。
1.要实现克隆,必须实现java.lang.Cloneable接口,否则在运行时调用 clone()方法,会抛出CloneNotSupportedException异常。
2.返回的是Object类型的对象,所以使用时可能需要强制类型转换。
3.该方法是protected的,如果想让外部对象使用它,必须在子类重写该方法,设定其访问范围是public的,参见PackageInfo的clone()方法。
4.Object的clone()方法的复制是采用逐字节的方式从内存复制数据,复制了属性的引用,而属性所指向的对象本身没有被复制,因此所复制的引用指向了相同的对象。由此可见,用这种方式复制对象是浅拷贝,不是深拷贝。静态工厂方法public static PackageInfo clonePackage(String userName)方法根据原型创建一份副本:首先拿出用户以前的一条数据,即这句PackageInfo prototype=loadPackageInfo(userName),然后调用它的clone()方法完成内存复制,即prototype.clone(),最后初始化这条新数据,比如使id为空等。
现在来看看测试代码,如下所示。
我们通过这句:PackageInfo currentInfo=PackageInfo.clonePackage("John"),复制了一份快递信息出来,通过设置currentInfo.setReceiverName("Ryan")和currentInfo.setReceiverAddress("People Square, Shanghai"),便完成了第二个包裹的信息录入,测试结果如下。
在实际应用中,使用原型模式创建对象图(Object Graph)非常便捷。
对象图不是一个单个对象,而是一组聚合的对象,该组对象有一个根对象。