Builder设计模式

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

UML结构图:


适用于以下情况:

1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2)当构造过程必须允许被构造的对象有不同的表示时。

抽象基类:
1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数

接口:
1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建函数接口,Builder的派生类来具体实现.
另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的两个接口函数完成对象的构建--也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)

解析:
Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的(哦,你见过车轮长在车座上的么?).
也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现.

实现:
Builder模式的实现基于以下几个面向对象的设计原则:1)把变化的部分提取出来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA和PartB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPartA,BuildPartB接口函数 2)采用聚合的方式聚合了会发生变化的基类,就是这里Director聚合了Builder类的指针.

1)Builder.h

  /* *******************************************************************
    created:    2006/07/19
    filename:     Builder.h
    author:        李创
                 http://www.cppblog.com/converse/ 
 
    purpose:    Builder模式的演示代码
******************************************************************** */ 

 
#ifndef BUILDER_H
  #define   BUILDER_H 
 
  //   虚拟基类,是所有Builder的基类,提供不同部分的构建接口函数 
  class   Builder
  {
 public :
    Builder() {} ;
     virtual   ~ Builder() {} 
 
     //  纯虚函数,提供构建不同部分的构建接口函数 
      virtual   void  BuilderPartA()  =   0 ;
     virtual   void  BuilderPartB()  =   0 ;
;

  //   使用Builder构建产品,构建产品的过程都一致,但是不同的builder有不同的实现
  //   这个不同的实现通过不同的Builder派生类来实现,存有一个Builder的指针,通过这个来实现多态调用 
  class   Director
  {
 public :
    Director(Builder *  pBuilder);
     ~ Director();

     void  Construct();

 private :
    Builder *  m_pBuilder;
;

  //   Builder的派生类,实现BuilderPartA和BuilderPartB接口函数 
  class   ConcreateBuilder1
    :   public   Builder
  {
 public :
    ConcreateBuilder1() {} 
      virtual   ~ ConcreateBuilder1() {} 
 
     virtual   void  BuilderPartA();
     virtual   void  BuilderPartB();
;

  //   Builder的派生类,实现BuilderPartA和BuilderPartB接口函数 
  class   ConcreateBuilder2
    :   public   Builder
  {
 public :
    ConcreateBuilder2() {} 
      virtual   ~ ConcreateBuilder2() {} 
 
     virtual   void  BuilderPartA();
     virtual   void  BuilderPartB();
;

  #endif


2)Builder.cpp

  /* *******************************************************************
    created:    2006/07/19
    filename:     Builder.cpp
    author:        李创
                 http://www.cppblog.com/converse/ 
 
    purpose:    Builder模式的演示代码
******************************************************************** */ 

 
#include   "  Builder.h  " 
#include   <  iostream  > 
 
  void   ConcreateBuilder1::BuilderPartA()
  {
    std::cout  <<   " BuilderPartA by ConcreateBuilder1/n " ;

 
  void   ConcreateBuilder1::BuilderPartB()
  {
    std::cout  <<   " BuilderPartB by ConcreateBuilder1/n " ;

 
  void   ConcreateBuilder2::BuilderPartA()
  {
    std::cout  <<   " BuilderPartA by ConcreateBuilder2/n " ;

 
  void   ConcreateBuilder2::BuilderPartB()
  {
    std::cout  <<   " BuilderPartB by ConcreateBuilder2/n " ;

 
Director::Director(Builder  *   pBuilder)
    : m_pBuilder(pBuilder)
  {

 
Director::  ~  Director()
  {
    delete m_pBuilder;
    m_pBuilder  =  NULL;

 
  //   Construct函数表示一个对象的整个构建过程,不同的部分之间的装配方式都是一致的,
  //   首先构建PartA其次是PartB,只是根据不同的构建者会有不同的表示 
  void   Director::Construct()
  {
    m_pBuilder -> BuilderPartA();
    m_pBuilder -> BuilderPartB();
}


3)Main.cpp

  /* *******************************************************************
    created:    2006/07/20
    filename:     Main.cpp
    author:        李创
                 http://www.cppblog.com/converse/ 
 
    purpose:    Builder模式的测试代码
******************************************************************** */ 

 
#include   "  Builder.h  " 
#include   <  stdlib.h  > 
 
  int   main()
  {
    Builder *  pBuilder1  =   new  ConcreateBuilder1;
    Director  * pDirector1  =   new  Director(pBuilder1);
    pDirector1 -> Construct();

    Builder *  pBuilder2  =   new  ConcreateBuilder2;
    Director  * pDirector2  =   new  Director(pBuilder2);
    pDirector2 -> Construct();

    delete pDirector1;
    delete pDirector2;

    system( " pause " );

     return   0 ;
}
posted on 2006-0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值