设计模式--Prototype(原型)

      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的优点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值