设计模式——原型模式
一、概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
二、UML示意图:
在UML示意图中,有一个抽象原型(Prototype)类并且声明了一个克隆自身的接口,具体原型类可以通过继承这个抽象原型类并且实现克隆接口来定义一个具体的原型类,然后客户端可以通过实例化一个具体的原型类的实例并且调用克隆接口来得到多个以这个原型实例为原型(嗯。。感觉说的好像有点绕但是感觉这么说又没问题)的新实例。
三、优缺点
优点:
- 通过原型模式,如果事先提供了一个原型实例,那么要得到新实例只需要调用克隆接口就行,而不需要知道创建实例所要做的具体工作细节,降低了耦合度。也就是说当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。
- 扩展性好。由于原型模式提供了抽象原型类,当要扩展系统的时候只要新增新的具体原型类就好。
缺点:
- 要为每一个具体原型类实现一个克隆方法,并且克隆方法位于原型类的内部,如果要修改原型类,就会有可能要修改到这个克隆方法。
- 在有些深克隆中,克隆方法的实现会很复杂,特别是在有多重嵌套引用的时候。有时候甚至要考虑到循环引用的问题。
四、深克隆和浅克隆的区别
在克隆一个对象时,如果克隆的字段是值类型,那么无论是深克隆还是浅克隆都会直接拷贝到新对象中。但如果遇到的是类类型,或者说字段保存的值是一个引用,那么浅克隆会复制这个引用到新对象的对应字段中,而深克隆则是对这个类类型的字段的对象再进行深克隆,把他复制到新对象中。