design pattern的学习和思考(2)

生成器(Builder)

生成器和抽象工厂非常的相似,都是用来生成对象的,生成器主要着重于一步步的创建一个复杂对象,并且在最后返回结果,而抽象工厂着重于创建一系列的对象,并且在创建后立即返回。
先看一下下面的代码

class  ProductPartA
{}
class  ProductPartB
{}
class  ComplexProduct
{
public :
    
void  AddPartA(ProductPartA *  partA){ m_PartAList.push_back(partA);}
    
void  AddPartB(ProductPartB *  partB){ m_PartBList.push_back(partB);}
            
private :
    vector
< ProductPartA *>  m_PartAList;
    vector
< ProductPartB *>  m_PartBList;
}

这段代码描述了一个复杂对像ComplexProduct,它由PartA的一个list和PartB的一个list组成,要创建这样一个对象就非常适合用生成器的设计模式,我们定义一个生成器

class  ComplexProductBuilder
{
public :
    
virtual   void  BuildProduct()
    { 
        m_Product 
=   new  ComplexProduct;
    }
    
virtual   void  BuildPartA()
    {
        ProductPartA
*  partA  =   new  ProductPartA;
        m_Product
-> AddPartA(partA);
    }
    
virtual   void  BuildPartB()
    {
        ProductPartB
*  partB  =   new  ProductPartB;
        m_Product
-> AddPartB(partB);
    }
    ComplexProduct
*  GetProduct()
    {
        
return  m_Product;
    }
private :
    ComplexProduct
*  m_Product;
}

有了这样一个生成器,我们就可以方便的生成一个ComplexProduct,假设ComplexProduct需要包含两个PartA,一个PartB

void  CreateComplexProduct( const  ComplexProductBuilder *  builder)
{
    builder
-> BuilderProduct();
    builder
-> BuilderPartA();
    builder
-> BuilderPartA();
    builder
-> BuilderPartB();
}

ComplexProductBuilder builder;
CreateComplexProduct(
& builder);
ComplexProduct
*  p  =  builder.GetProduct();

可以看到,生成器帮我们全权代理了对象的整个构建过程,使其与对象的表现形式所分开,另一方面我们还可以通过继承来实现各种我们所需要的生成器,一个特殊的例子就是,我们可以通过生成器来给对象计数,再看上面的例子,如果我们需要知道PartA和PartB的个数,就可以构建一个计数的生成器来实现

class  ComplexProductCountBuilder
{
public :
    
virtual   void  BuildProduct()
    { 
        m_PartACnt 
=   0 ;
        m_PartBCnt 
=   0 ;
    }
    
virtual   void  BuildPartA()
    {
        m_PartACnt
++ ;
    }
    
virtual   void  BuildPartB()
    {
        m_PartBCnt
++ ;
    }
    
int  GetPartACnt(){  return  m_PartACnt;    }
    
int  GetPartBCnt(){  return  m_PartBCnt;    }
private :
    
int  m_PartACnt;
    
int  m_PartBCnt;
}

// 调用
ComplexProductCountBuilder cntBuilder;
CreateComplexProduct(
& cntBuilder);
int  PartACount  =  cntBuilder.GetPartACnt();
int  PartBCount  =  cntBuilder.GetPartBCnt();

是不是非常的方便,一点也不用修改原来的代码。通常,如果一个对象是通过其他对象组合的方式得到的,就可以考虑使用生成器模式

最后给大家一张生成器的UML图来方便大家理解

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值