zoukankan      html  css  js  c++  java
  • 设计模式之六:Builder(转)

    一、功能 

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

      二、结构图

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

      三、示例代码 

     1 class Product1 { /*...*/ } ;
     2 class Product2 { /*...*/ } ;
     3 
     4 class Builder //抽象基类
     5 {
     6 public:
     7     virtual void BuilderPartA() {} //提供缺省实现
     8     virtual void BuilderPartB() {}
     9     virtual void BuilderPartC() {}
    10 protected:
    11     Builder() {}
    12 } ;
    13 
    14 class ConcreteBuilder1 : public Builder //创建Product1
    15 {
    16 public:
    17     ConcreteBuilder1() : _product(NULL) {}
    18 
    19     virtual void BuilderPartA() { /*...*/ } 
    20     virtual void BuilderPartB() { /*...*/ }
    21     virtual void BuilderPartC() { /*...*/ }
    22 
    23     virtual Product1* GetProduct1() 
    24     { return _product ; } //返回创建的Product1对象
    25 private:
    26     Product1 *_product ;
    27 } ;
    28 
    29 class ConcreteBuilder2 : public Builder //创建Product2
    30 {
    31 public:
    32     ConcreteBuilder2() : _product(NULL) {}
    33 
    34     virtual void BuilderPartA() { /*...*/ } 
    35     virtual void BuilderPartB() { /*...*/ }
    36     virtual void BuilderPartC() { /*...*/ }
    37 
    38     virtual Product2* GetProduct2() 
    39     { return _product ; } //返回创建的Product2对象
    40 private:
    41     Product2 *_product ;
    42 } ;
    43 
    44 class Director
    45 {
    46 public:
    47 //创建对象(Director并不知道具体创建出来的对象是什么样的,只有调用该函数的client知道)
    48     void Construct(Builder *builder)
    49     {
    50         builder->BuilderPartA() ;
    51         builder->BuilderPartB() ;
    52         builder->BuilderPartC() ;
    53     }
    54 } ;
    55 
    56 客户端代码:
    57     Director director ;
    58 
    59     // 创建第一种对象
    60     ConcreteBuilder1 *pBuilder1 = new ConcreteBuilder1() ;
    61     director.Construct(pBuilder1) ;
    62     Product1 *product1 = pBuilder1->GetProduct1() ;
    63 
    64     // 创建第二种对象
    65     ConcreteBuilder2 *pBuilder2 = new ConcreteBuilder2() ;
    66     director.Construct(pBuilder2) ;
    67     Product2 *product2 = pBuilder2->GetProduct2() ;    
    View Code

    四、实例

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

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

  • 相关阅读:
    [SDOI2008]Sue的小球
    【洛谷P2611】小蓝的好友
    【YbtOJ#20051】简单游走
    【洛谷P3338】力
    【洛谷P3803】【模板】多项式乘法(FFT)
    【YbtOJ#10053】合影队形
    【YbtOJ#20056】树上取模
    【洛谷P1919】【模板】A*B Problem升级版
    初赛练习总结
    【洛谷P3723】礼物
  • 原文地址:https://www.cnblogs.com/wangzhijun/p/3466759.html
Copyright © 2011-2022 走看看