阿Sam的设计模式学习笔记---- Builder模式

1,  功能:将一个功能复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2,  基本思想:
通常一个复杂的对象由各个部分组成,有时可能因为客户需求,版本升级等原因,各个部分内部不停的发生变化,但是将它们组装成一起的方法相对固定。 Builder 模式将产品内部状态和生产过程分割,同一个生产过程可以生产出内部具有不同表象的产品。
Builder 模式的根本目的就是解耦过程和部件。
一个 Product 是一个复杂的产品,它由很多部分组成。为了能生产“不同表象”的产品,需要一个 Builder 提供抽象接口,并由 ConcreteBuilder 实现这些接口并装备 Product 的各个部分。最后 Director 来使用 Builder 接口方法(通过 ConcreteBuilder 对接口的多态实现)来构造并获得生产出来的复杂产品。
具体每个部件的创建是由 ConcreteBuilder 完成的,一个 ConcreteBuilder 会生产出所需的所有部件,组装过程是由 Director 调用 Builder 对象的接口来实现的。
3,  适用情况:
  • 创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式;
  • 构造过程需要构造出具有不同表象的对象。
4,  结构:
Class Diagram
Sequence Diagram
5,  代码示例:
本人是吃移动通信这碗饭的,资质愚钝,目光短浅,只能举一下这方面的例子了。中国移动是运营商( Carrier ),现在他想在上海和四川建立两个无线网络。为了简化例子,网络中的网元只有 BSC BTS MSC 。每个网元的产品可能会变化,但是这些网元组装在一起的方式不会变,运营商都必须要有这些设备来组成网络。
A. 网络( Network )是一个复杂对象,就是我们要组建的 Product

  
  
   
   
class  Network   //  Builder
{
public :
    
void  addBSC( const   char   * bsc) {  if (bsc) strcpy(BSC, bsc); }
    
void  addBTS( const   char   * bts) {  if (bts) strcpy(BTS, bts); }
    
void  addMSC( const   char   * msc) {  if (msc) strcpy(MSC, msc); }    
    
void  showNet() {cout  <<   " The network in this place: BSC ==>  "   <<  BSC  <<   "  || BTS ==>  "   <<  BTS  <<   "  || MSC ==>  "   <<  MSC  <<  endl;}
private :
    
char  BSC[ 15 ];    
    
char  BTS[ 15 ];    
    
char  MSC[ 15 ];
};
B. Builder 模式中的 Builder 提供构造各个部分的接口,以及返回产品的接口,每个接口的具体实现放在子类。各个 ConcreteBuilder 根据自己所需构造各个部分,并且实现返回 Product 的接口。本例中, Builder 就是设备提供商( Provider ),他们来为运营商提供网络的各个部分。

  
  
   
   
class  Network   //  Builder
{
public :
    
void  addBSC( const   char   * bsc) {  if (bsc) strcpy(BSC, bsc); }
    
void  addBTS( const   char   * bts) {  if (bts) strcpy(BTS, bts); }
    
void  addMSC( const   char   * msc) {  if (msc) strcpy(MSC, msc); }    
    
void  showNet() {cout  <<   " The network in this place: BSC ==>  "   <<  BSC  <<   "  || BTS ==>  "   <<  BTS  <<   "  || MSC ==>  "   <<  MSC  <<  endl;}
private :
    
char  BSC[ 15 ];    
    
char  BTS[ 15 ];    
    
char  MSC[ 15 ];
};

class  Provider   // Builder, 设备提供商
{
public :
     virtual 
void  buildBSC()  =   0 ;    
     virtual 
void  buildBTS()  =   0 ;    
     virtual 
void  buildMSC()  =   0 ;    
     virtual Network getNetwork() 
=   0 ;
}; 
class  Ericsson:  public  Provider   //  ConcreteBuilder, 一个具体的设备提供商
{
public :
    Ericsson();    
    
~ Ericsson(){}    
    
void  buildBSC() {mobileNet.addBSC( " Ericsson BSC " );}    
    
void  buildBTS() {mobileNet.addBTS( " Ericsson BTS " );}    
    
void  buildMSC() {mobileNet.addMSC( " Ericsson MSC " );}    
    Network getNetwork() {
return  mobileNet;} private :    
    Network mobileNet;
}; 
Ericsson::Ericsson()
{
    mobileNet.addBSC(
" NULL " );    
    mobileNet.addBTS(
" NULL " );    
    mobileNet.addMSC(
" NULL " );


class  Alcatel:  public  Provider   //  ConcreteBuilder, 一个具体的设备提供商
{
public :
    Alcatel();    
    
~ Alcatel(){}    
    
void  buildBSC() {mobileNet.addBSC( " Alcatel BSC " );}    
    
void  buildBTS() {mobileNet.addBTS( " Alcatel BTS " );}    
    
void  buildMSC() {mobileNet.addMSC( " Alcatel MSC " );}    
    Network getNetwork() {
return  mobileNet;}
private :
    Network mobileNet;
}; 
Alcatel::Alcatel()
{
    mobileNet.addBSC(
" NULL " );    
    mobileNet.addBTS(
" NULL " );    
    mobileNet.addMSC(
" NULL " );
}
C. Director 来负责实现实际的组装工作 . Director 实际上调用 Builder 对象的成员来组装产品,最后还是通过 Builder 对象提供的得到产品的接口来得到最后组装的产品。本例中,运营商就是 Director 对象,他通过与他签订合同(传递参数)的设备商( Provider )来建立网络( Product )。
class  Carrier   //  Director
{
public :
    
void  constructer(Provider  *  devProvider);
};
void  Carrier::constructer(Provider  *  devProvider)
{
    devProvider
-> buildBSC();
    devProvider
-> buildBTS();
    devProvider
-> buildMSC();
}
D. 在客户端为上海和四川建立网络了。
int  main()
{
    Carrier CMCC; 
// 中国移动是一个运营商,是Director对象
 
    Provider 
*  devProvider1  =   new  Ericsson();  // 定义一个ConcreteBuilder
    Provider  *  devProvider2  =   new  Alcatel();    // 又一个ConcreteBuilder
 
    CMCC.constructer(devProvider1); 
// 移动用Ericsson的设备在上海建网
    Network ShanghaiNet  =  devProvider1 -> getNetwork();
    ShanghaiNet.showNet();
 
    CMCC.constructer(devProvider2); 
// 运营商用Alcatel的设备在四川建网。
    Network SichuanNet  =  devProvider2 -> getNetwork();
    SichuanNet.showNet();
 
    delete devProvider1;
    delete devProvider2;
 
    
return   0 ;
}
回顾一下上面的例子,运营商要建立一个网络:
  • 网络就是 Product.
  • Builder 对应构建网络的各个部分( BSC BTS MSC )。
  • ConcreteBuilder 就是具体的设备商,有 Ericsson Alcatel
  • Director 就是运营商 CMCC ,它使用不同的设备提供商来建网。
6,  总结:
1)        Builder 模式用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分经常变化。
2)        产品通常不需要抽象类,因为我们强调的是生成复杂的产品的过程相对稳定,复杂对象的各部分变化较大,而且这些个部分不一定有相同的父类,所以不需要产品的抽象类。
3)        比较一下 Simple Factory Abstractor Factory Factory Method Builder 模式
A. 生成简单对象的情况,使用 Simple Factory 即可;
B. 需要生成复杂对象的情况,使用 Builder 模式。进一步优化,可以让 Builder 负责生成复杂对象,复杂对象的各部分的生成可以用 Simple Factory 来实现。
C. 如果系统发展壮大,导致需要许多的 Builder 来构造许多复杂对象,这是就需要用 Abstract Factory 生成一系列的 Builder ,以对复杂对象的生成进行系统管理;
D. Factory Method 可以用于更大的系统,让基本功能在父类中实现,具体的对象生成由子类完成,可以使用其它三种方式配合完成具体对象的产生。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值