设计模式在综合前置中的运用(三)--建造者模式

来源:互联网 发布:好的哲学书籍推荐知乎 编辑:程序博客网 时间:2024/05/29 03:35

我们先看看建造者模式的基本定义。建造者模式的英文为Builder,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式的适用性如下:

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

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

建造者模式的组成如下:

1)         抽象建造者角色:这个角色用来规范产品对象的各个组成成分的建造。一般而言,此角色独立于应用程序的业务逻辑。

2)         具体建造者角色:担任这个角色的是于应用程序紧密相关的类,它们在指导者的调用下创建产品实例。这个角色在实现抽象建造者角色提供的方法的前提下,达到完成产品组装,提供成品的功能。

3)         指导者角色:调用具体建造者角色以创建产品对象。指导者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

4)         产品角色:建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。

来看一下这些角色组成的类图:


首先客户程序创建一个指导者对象,一个建造者角色,并将建造者角色传入指导者对象进行配置。然后,指导者按照步骤调用建造者的方法创建产品。最后客户程序从指导者那里得到产品。从建造模式的工作流程来看,建造模式将产品的组装“外部化”到了指导者和建造者角色中来。这是和任何正规的工厂模式不一样的--产品的创建是在产品类中完成的。

我的理解:指导者负责产品创建的流程,即将创建产品各个部件的步骤串联起来。而建造者负责产品各个部件的具体创建。

接下来谈谈建造者模式在综合前置中的运用。从具体类的设计来看,严格上说,本系统并没有运用建造者模式。但是系统中很多类的创建都是将一个复杂对象的构建与它的表示分离的,我认为从概念上来讲可以归为建造者模式。下面以组件装载器的设计为例进行说明。类图如下:


Loader为组件装载器接口,定义了组件装载的方法。TraditionalChannelLoader实现了Loader接口,为传统渠道组件装载器,负责生成传统渠道组件实例。TraditionalChannel类为传统渠道组件类。

对比建造者模式来看,TraditionalChannel类为产品角色,Loader为抽象建造者角色,TraditionalChannelLoader为具体建造者角色。其中缺少了一个指导者的角色。其实,从代码实现的功能来看,TraditionalChannelLoader既负责了产品创建的流程又负责了产品各个部件的具体创建,即它承担了指导者和建造者两个角色。当然,这种设计在目前的系统中已经具备一定的扩展性,因为它已经将一个复杂对象的构建与它的表示及操作分离了。如果能够再充分运用建造者模式,将创建产品的流程与创建产品各个部件的实现进一步分离,则会带来更强的扩展性。

优化后的类图如下所示:


优化之后,ChannelBuilder为抽象建造者角色,提供了所有部件的创建方法。TraditionalChannelBuilder为具体建造者角色,实现了ChannelBuilder接口。TraditionalChannelLoader为指导者角色,负责调用TraditionalChannelBuilder的所有创建部件的方法来创建TraditionalChannel产品。

0 0
原创粉丝点击