Aha!设计模式(13)-BUILDER(4)

参与者

 

Builder(TextConverter)
— 为创建一个Product对象的各个部件指定抽象接口。
•ConcreteBuilder(ASCIIConverter,TeXConverter,TextWidgetConverter)
— 实现Builder的接口以构造和装配该产品的各个部件。
— 定义并明确它所创建的表示。
— 提供一个检索产品的接口(例如, GetASCIIText和GetTextWidget)。
• Director(RTFReader)
— 构造一个使用Builder接口的对象。
• Product(ASCIIText、TeXText、TextWidget)
— 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
— 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

 

又是一个理解着记忆的问题。

 

首先是抽象Builder类和具象ConcreteBuilder类,一个是定义接口,一个是实现接口。23个设计模式大概有二十个都是这样;

 

使用Builder的类是Director而不是Client,是因为Builder的职责都是相对基础的,怎么做需要Director来指挥。

 

至于Product,只要记住它比较复杂就好了。

 

协作

 

• 客户创建Director对象,并用它所想要的Builder对象进行配置。
• 一旦产品部件被生成,导向器就会通知生成器。
• 生成器处理导向器的请求,并将部件添加到该产品中。
• 客户从生成器中检索产品。

 

这几句翻译的不大准确,一定程度上增加了理解的难度。以下是作者的翻译。

 

• 客户创建Director对象,并用它所需要的Builder对象对Director对象进行配置。
• 当产品部件需要被生成的时候,Director就会通知Builder。
• Builder处理Director的请求,并将部件添加到产品中。
• 客户从Builder中接收产品。

 

以下是《设计模式》中说明上述协作的序列图。

 

Aha!设计模式(13)-BUILDER(4)

GetResult只是语义上的取得,Client也可以事先指定文件名,或者一块内存以容纳将要构建的对象。

 

作者观点

 

只要符合一个条件:构建的对象比较复杂,需要分步进行。就可以考虑Builder模式。

 

使用不同的顺序调用不同的接口,就可以得到不同的产品。例如盖大楼,砌不同尺寸的墙,安装不同的门窗,我们就可以得到完全不同的大楼。

 

注:

 

本文中蓝色粗体文字都引自《设计模式》一书。

 

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

Aha!设计模式(13)-BUILDER(4)