c++设计模式(3)-Builder

一、功能

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

二、结构图



各类之间的交互关系如下图所示:



三、示例代码

namespace DesignPattern_Builder
{
          class Product1 { /*...*/ } ;
          class Product2 { /*...*/ } ;

          // class Builder
          class Builder //抽象基类
          {
          public:
                    virtual void BuilderPartA() {} //提供缺省实现
                    virtual void BuilderPartB() {}
                    virtual void BuilderPartC() {}
          protected:
                    Builder() {}
          } ;

          // class ConcreteBuilder1
          class ConcreteBuilder1 : public Builder //创建Product1
          {
          public:
                    ConcreteBuilder1() : _product(NULL) {}

                    virtual void BuilderPartA() { /*...*/ } 
                    virtual void BuilderPartB() { /*...*/ }
                    virtual void BuilderPartC() { /*...*/ }

                    virtual Product1* GetProduct1() { return _product ; } //返回创建的Product1对象
          private:
                    Product1 *_product ;
          } ;

          // class ConcreteBuilder2
          class ConcreteBuilder2 : public Builder //创建Product2
          {
          public:
                    ConcreteBuilder2() : _product(NULL) {}

                    virtual void BuilderPartA() { /*...*/ } 
                    virtual void BuilderPartB() { /*...*/ }
                    virtual void BuilderPartC() { /*...*/ }

                    virtual Product2* GetProduct2() { return _product ; } //返回创建的Product2对象
          private:
                    Product2 *_product ;
          } ;

          // class Director
          class Director
          {
          public:
                    //创建对象(Director并不知道具体创建出来的对象是什么样的,只有调用该函数的client知道)
                    void Construct(Builder *builder)
                    {
                              builder->BuilderPartA() ;
                              builder->BuilderPartB() ;
                              builder->BuilderPartC() ;
                    }
          } ;
}

客户端代码:
{
          using namespace DesignPattern_Builder ;

          Director director ;

          // 创建第一种对象
          ConcreteBuilder1 *pBuilder1 = new ConcreteBuilder1() ;
          director.Construct(pBuilder1) ;
          Product1 *product1 = pBuilder1->GetProduct1() ;

          // 创建第二种对象
          ConcreteBuilder2 *pBuilder2 = new ConcreteBuilder2() ;
          director.Construct(pBuilder2) ;
          Product2 *product2 = pBuilder2->GetProduct2() ;
}

四、实例

(1)例子一。如下图所示:



上图的功能是是把一个RTF文件转换为多种正文格式。RTFReader进行语法分析,然后将所有的token串逐一转换。可见builder就是一步步地把各个部分组装为一个整体。它封闭了组装的方法,组装出来的对象也大相径庭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值