Prototype为一种创建型的设计模式。它定义了如何取创建对象。它在实现的时候,代码和factory区别不大。个人认为,所有的代码实现都查不多,就是继承和组合。好的设计模式,有几个可比较的方面。
比如,一个模式通过组合能实现的需求,要比通过继承来实现的模式好。
一个模式通过改变类的对象就能满足需求,比要通过改变类来实现的模式好。
prototype就是通过对象的改变来实现不同的创建需求。
通过一个具体的例子可以导出为啥需要prototype的模式。只要不嫌麻烦,factory模式就可以完全满足所有的创建对象需求,但是针对特定的例子里面,factory显得太通用而效率不高。所以才有其他的创建型的模式出来。
在我们的例子中,我们的目的是生成自行车。我们需要生产3种类型的直行车,分别是 红色16寸,黑色20寸,蓝色24寸。一辆自行车又可以分3个部件:龙头,主架,轮子。
1,一开始,我们使用factory模式来创建自行车的各个部件。通过分析,生产直行车的过程描述如下:
Bike* Factory::CreateBike( int color, int size)
{
LongTou* lt = Factory::CreateLongTou( color, size );
ZhuJia* zj = Factory::CreateZhuJia( color, size );
LunZhi* lz = Factory::CreateLunZhi( color, size );
Bike* p = new Bike( lt, zj, lz);
retrun p;
}
当需求变化了,比如要生成一种新的类型的直行车,用户(也就是调用者)也需要修改代码,至少调用CreateBike的参数是要变化的,这个变化需要用户参与修改。
2, 使用Prototype模式,生产过程就不一样了。我们需要定义一个tools。这个tools是一个抽象的创建自行车的类。用户只需要使用这个tools就可以创建出一辆直行车。
不同的直行车对应不同的tools的具体对象,即每个tools对象创建一种类型的直行车。当需要生产新的直行车的时候,只需要创建出一个新的tools对象就可以了。可以看到,是一个新的tools对象就能搞定,而不是定义一个新的factor类。通过对象的变化来满足新的需求,比通过类的变化来的更方便。
每个tools对象可以生产出不同的直行车,是因为每个tools对象在创建的时候,就指定了tools需要使用到的部件,具体到组装直行车时候,tools把自己包含的部件克隆一份,然后组装下,就是你需要的直行车了。
class BikeTools
{
SetLongTouProtoType( LongTou* t ){ m_lt = t; }
SetZhuJiaProtoType( ZhuJia* t ){ m_zj = t; }
SetLunZhiProtoType( LunZhi* t ){ m_lz = t; }
Bike* CreateBike()
{
return new bike( m_lt.colon(), m_zj.colon(), m_lz.colon() );
}
private:
LongTou* m_lt;
ZhuJia* m_zj;
LunZhi* m_lz;
}
2种方法直接的差异在于,一般的factory,你需要关心自行车的创建过程,龙头啥颜色的啥尺寸的,你需要一一过目。如果你需要生产一种新类型的直行车,你又需要再关心,龙头是啥颜色,啥尺寸。
而Prototype模式,你只需要关心BikeTools的具体对象,调用CreateBike()就搞定了。如果有新的类型,还是BikeTools的对象,一模一样的调用CreateBike()。不同的直行车,有Biketools对象来决定,用户不用关心。这里,Biketools还有个方便的地方,作为设计师,你可以动态的更改biketools对象里面的部件,这样就可以生产出新的类型的直行车,同时用户行为一点变化都没有,你完全不用去通知用户你做了修改。这就是Prototype的优点。