建造模式(Builder)(转)

建造模式(Builder)体现了艺术性的“建造”,并不是像工厂模式一样简单地生产一个产品对象,提供给请求者就满足了。建造模式,在其建造地过程中,能够非常清晰将一个产品的组成部分分离开来,同时又能够在一定的指导下进行合理的组装起来,完成客户端更高要求的请求。

另外,作为产品类,它并非就是一个实实在在实体类,有时候一个产品类可能是一个能够完成相当复杂,或者具有相当关键的操作的具体类,甚至在系统的设计中位于十分核心的位置。如何合理地对这些产品类的对象进行组装的同时,可能依赖它们来完成某些业务过程。

建造模式的一般结构如图所示:

 


上图清晰地给出了建造模式所对应的角色,这四个角色为:

01.指导者角色
02.抽象建造者角色
03.具体建造者角色
04.具体产品角色

下面详细阐述建造模式中各个角色的具体含义:

01.指导者角色

指导者角色是建造模式中非常关键的一个角色,如果没有它,当客户端请求时,无法对产品进行有序合理地建造。指导者角色关注的是,抽象建造者角色所抽象出来操作步骤,并根据这些步骤给出一个合理的执行顺序来对产品对象进行装配建造。

一个指导者实现类可以指导多个产品对象的建造,亦即,指导者实现类是知道这个产品对象的具体组装顺序的,从而给抽象建造者类以帮助。但是,由于抽象建造者类并没有将具体的建造细节在指导者实现类中表现出来,所以指导者实现类对产品如何组装建造的细节一无所知。

如果必要的的话,指导者实现类在完成产品的组装以后,根据客户端调用所传达的启发式信息,返回建造的结果,以响应客户端的请求。

02.抽象建造者角色

抽象建造者角色是对产品建造过程的抽象,也就是对产品该如何组装建造进行规范化。但是,抽象建造者角色只是给出这些操作步骤的抽象方法,具体地建造实现有具体建造者角色来完成。可见,抽象建造者角色也无从知道产品的具体建造的细节。

在抽象建造者类的抽象设计中,如果不要求返回建造产品的对象,抽象建造者甚至都不知道具体建造的是哪一个产品对象,而只是知道某某对象先这样做,然后这样做,……,最后这样做。

03.具体建造者角色

具体建造这角色是与具体产品角色紧密联系的,而正是抽象建造者角色屏蔽了具体建造者角色所实现的操作的细节,使得指导者角色无法知道具体建造的细节。

具体建造者类非常熟悉产品的具体结构,都由哪些部分组成,调用产品对象的哪些方法能完成什么功能,等等。同时,具体建造者类继承(或实现)了抽象建造者规范定义的建造步骤(可能对哪一步在先,哪一步在后并不能确定),最终完成了产品的组装建造。

04.具体产品角色

具体产品角色,很显然代表了一个具体的产品对象,是具体建造者角色的直接数据来源。

具体产品实现类一般具有比较复杂的组成结构,如包含其他复杂的类属性,而这些类的对象的构造可能也相对复杂一些,这样才能发挥出具体建造者实现类的建造能力——将一个具有如此复杂组成的产品对象,根据抽象建造者类的指示,一个步骤一个步骤地完成某个小部件的构造,剩下的工作就是在指导者实现类的指导下进行组装了。

基于上面对建造模式的四个角色的理解的基础上,下面基于建造模式,通过实例进行分析设计。

第一种:

为了更加直观、形象,上图对组成具体产品的部件也进行了简单的设计,Part是构成具体产品的部件的统一接口,当然也可以是多个不同接口实现的部件构成的产品对象。该图比较清晰地表现出了建造模式中各个角色所对应的类,容易理解。

上面图中,需要说明的是,客户端调用指导者对象的时候,直接将构造产品对象的部件全部作为指导方法directBuild的参数值(引用)传递过来,所以要求抽象建造者只是以这些部件作为每个建造的方法(一个小步骤)的参数,以为具体建造者提供规范。

在实际系统设计中,构成产品对象的全部小部件所需要的基本类型数据完全被发送到指导者对象那里,然后指导者委托抽象建造者根据这些基本类型数据进行规划设计,抽象出建造方法,等待具体建造者来具体实现。此时,具体建造者需要对某个或者某些部件进行加工构造。

第二种:



上面这个图,体现了基于建造模式的设计的扩展,它要求对抽象建造者类的设计具有更好的通用性,能够适应由于具体产品对象的组成变化,而能够通过扩展抽象建造者类,在具体建造者类中来实现具体产品对象的建造。

 

其中,ConcreteProduct与OtherConcreteProduct产品类对象分别都是由SequencePart与DirectionPart的具体部件所组成,并分别通过ConcreteBuilder与OtherConcreteBuilder具体建造者类对象来实现产品的组装建造。

当然,如果客户端请求者要求返回实际对应的产品对象的话,使用建造模式就可能不能够很好地进行扩展了,因为多个客户端可能要求建造的产品对象,必须通过抽象建造者类来返回,所以,除非将全部可能的返回类型都包括——自然而然想到,返回类型是Object即可,然后客户端会根据自己的实际需要进行类型强制转换获得,满足自身请求的需要。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值