第5章 原型(Prototype)模式
很多Java程序员容易把原型模式和Object.clone()方法混为一谈,本章将全面讲述原型模式,包括如下内容:
什么是原型模式,原型模式的优点和适用场景。
原型模式的深拷贝和浅拷贝,及它们的实现。
5.1 原型模式
谈到原型模式,学过Java的人可能会想到java.lang.Cloneable这个接口,以为Java的原型模式描述的就是java.lang.Cloneable接口的使用,这就大错特错了。其实,原型模式在我们日常生活中经常可以看到,比如你刚给你的客厅做了装修,你朋友正好也希望给他的客厅做装修,那么,他可能会把你家的装修方案拿过来改改就成,你的装修方案就是原型。
由于很多OOP语言都支持对象的克隆(拷贝)以方便复制对象,但这些方式并不那么完美,后述我们将会讨论。
当创建这些对象(一般情况是一些大对象)非常耗时,或者创建过程非常复杂时,非常有用,GoF给出的原型模式定义如下。
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
使用原型实例指定将要创建的对象类型,通过复制这个实例创建新的对象。
原型模式的静态类图非常简单,如图5-1所示。
图5-1
Client使用Prototype的clone()方法得到这个对象的副本,其实复制原型对象不一定是指从内存中进行复制,我们的原型数据也可能保存在数据库里。
一般情况下,OOP语言都提供了内存中对象的复制能力,Java语言提供了对象的浅拷贝(Shallow copy),也就是说复制一个对象时,如果它的一个属性是引用,则复制这个引用,使之指向内存中同一个对象;但如果为此属性创建了一个新对象,让其引用指向它,即是深拷贝(Deep copy)。