《Java设计模式及实践》—2.4 原型模式
2.4 原型模式
原型模式看似复杂,实际上它只是一种克隆对象的方法。现在实例化对象操作并不特别耗费性能,那么为什么还需要对象克隆呢?在以下几种情况下,确实需要克隆那些已经经过实例化的对象:
依赖于外部资源或硬件密集型操作进行新对象的创建的情况。
获取相同对象在相同状态的拷贝而无须进行重复获取状态操作的情况。
在不确定所属具体类时需要对象的实例的情况。
请看如图2-8所示的类图。
图 2-8
在原型模式中,主要涉及以下类:
Prototype(抽象原型类):声明了clone()方法的接口或基类,其中clone()方法必须由派生对象实现。在简单的场景中,并不需要这种基类,只需要直接具体类就足够了。
ConcretePrototype(具体原型类):用于实现或扩展clone()方法的类。clone()方法必须要实现,因为它返回了类型的新实例。如果只在基类中实现了clone()方法,却没有在具体原型类中实现,那么当我们在具体原型类的对象上调用该方法时,会返回一个基类的抽象原型对象。
可以在接口中声明clone()方法,因而必须在类的实现过程中实现clone()方法,这项操作会在编译阶段强制执行。但是,在多继承层次结构中,如果父类实现了clone()
方法,继承自它的子类将不会强制执行clone()方法。
浅拷贝和深拷贝
拷贝对象时,我们应该清楚拷贝的深度。当拷贝的对象只包含简单数据类型(如int和float)或不可变的对象(如字符串)时,就直接将这些字段复制到新对象中。但当拷贝对象中包含对其他对象的引用时,这样就会出现问题。例如,如果为具有引擎和四个轮子的Car类实现拷贝方法时,我们不仅要创建一个新的Car对象,还要创建一个新的Engine对象和四个新的Wheel对象。毕竟两辆车不能共用相同的发动机和车轮,这称为深拷贝。
浅拷贝是一种仅将本对象作为拷贝内容的方法。例如,如果我们要为Student对象实现拷贝方法,就不会拷贝它所指向的Course对象,因为多个Student对象会指向同一个Course对象。
在实践中,我们应根据具体情况来决定使用深拷贝、浅拷贝或混合拷贝。通常,浅拷贝对应于聚合关系,而深拷贝则对应于组合关系。
- 点赞
- 收藏
- 关注作者
评论(0)