第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所示。

    figure_0070_0044

    图5-1

    Client使用Prototype的clone()方法得到这个对象的副本,其实复制原型对象不一定是指从内存中进行复制,我们的原型数据也可能保存在数据库里。

    一般情况下,OOP语言都提供了内存中对象的复制能力,Java语言提供了对象的浅拷贝(Shallow copy),也就是说复制一个对象时,如果它的一个属性是引用,则复制这个引用,使之指向内存中同一个对象;但如果为此属性创建了一个新对象,让其引用指向它,即是深拷贝(Deep copy)。