效果
这里是Builder模式的主要效果:
1 ) 它使你可以改变一个产品的内部表示。
首先明确两个词。一是前面已经提到过《设计模式》书中将representation翻译成表示,作者认为应该译为表现;二是关于内部的理解。当我们用不同的方式盖两座大楼时,它们的内部当然不同,但是大多数情况下外部也会不同。所以作者认为,《设计模式》这部分内容中提到的内部,应该指的是隐藏在构建接口后面的那部分。
Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
这段话的另一个问题就是所谓的表现,内部结构和如何装配的问题。
例如对于如下的Work文档。
可以定义转换成其他格式的Builder:
抽象接口只是定义了生成两种标题和正文的接口,具体的实现,例如如何表现,怎么装配等完全交给具象类。
对于HtmlBuilder,其生成的文件如下,除了红色粗体的文字以外,增加了非常多的信息,例如HTML版本,文件开始结束标记,META信息等等,等等。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=gb2312">
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice 4.1.5 (Win32)">
<META NAME="AUTHOR" CONTENT="Weiguo Xue">
<META NAME="CREATED" CONTENT="20180719;21550277">
<META NAME="CHANGEDBY" CONTENT="Weiguo Xue">
<META NAME="CHANGED" CONTENT="20180719;22204665">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="ja-JP" DIR="LTR">
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US">Aha</SPAN></FONT></FONT><FONT SIZE=6 STYLE="font-size: 26pt">!</FONT><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US">DesignPattern(15)-BUILDER(5)
</SPAN></FONT></FONT>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US"><STRONG><FONT COLOR="#000000"><SPAN STYLE="text-decoration: none"><SPAN STYLE="background: transparent">Consequences</SPAN></SPAN></FONT></STRONG></SPAN></FONT></FONT></P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US"><STRONG><FONT COLOR="#000000"><SPAN STYLE="text-decoration: none"><FONT SIZE=4><SPAN STYLE="background: transparent">Here
are key consequences of the Builder pattern:</SPAN></FONT></SPAN></FONT></STRONG></SPAN></FONT></FONT></P>
</BODY>
</HTML>
对于同样的接口,MarkDownBuilder生成以下的文档:
#
##
Here are key consequences of the Builder pattern:
增加的只有两个表示标题的标记:#和##。
作者观点
某位大师(据说是Andrew Koenig)说过:Abstraction is selective ignorance. (抽象就是有选择地装糊涂。) 。换句话说抽象就是选择性地将一部分信息隐藏起来,装作看不见。因为看不见,所以降低了耦合性。具体到Builder模式,隐藏了构建产品的细节,所以得到了生成不同产品的灵活性。
注:
本文中蓝色粗体文字都引自《设计模式》一书。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】