首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GoF在现实生活中的Builder实现

GoF在现实生活中的Builder实现
EN

Software Engineering用户
提问于 2016-09-11 07:35:25
回答 1查看 1.6K关注 0票数 5

我试图理解构建器模式的用法,因此调用分离是分组中的用法类型。以下是我的发现:

  • 建造者可以用来为他正在建造的物体提供不变性(避免伸缩)。叫约书亚·布洛赫的建造者。因此,我们使用构造器来方便具有许多字段的对象的构建。
  • 构建器可以构建一些需要结构化的对象,并遵循一些结构rools。例如,XmlBuilder,它生成xml,在传递错误数据时可能会失败(例如,不关闭标记,等等)。在本例中,生成器在每个构建步骤上验证内部对象。

但是GoF的建筑工人呢?使用导演、抽象生成器和不同的实现。在生产中,我从未见过这样的实施。你见过这样的例子吗?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-09-11 20:02:00

理解GoF设计模式的一个关键是它们的意图。对于建筑商来说,它是:

将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。

简化变体

在查看GoF提出的解决方案时,最令人震惊的是部件的单独构建和组装:该结构区分了DirectorBuilder,并支持一步一步的构造:

  • 这个模式的这一方面显然也画了约书亚布洛赫,因为他的方法使用这种分离来设置许多可选参数。
  • 这个事件序列还允许在组装结果之前验证部件,正如您在这个XmlBuilder中所注意到的。

虽然非常有用,但我认为这些示例只关注模式的一个方面,而忽略了真正的意图。因此,通过合并DirectorBuilderBuilderConcreteBuilder,它们的结构看起来很简单。

缺失意图

对于GoF来说,不仅是要逐步构建DirectorBuilder之间的分离,还包括BuilderConcreteBuilded之间的分离:

  • 如果仔细观察图案结构,您会注意到Builder提供了多态/虚拟buildPart()方法。而getResult()获取最终产品是ConcreteBuilder的一种方法,它不包含在抽象Builder的S接口中,因此可以使用不同的参数或返回不同的类型。
  • 页99上的GoF序列图还显示,Client调用Director来构造对象并触发部件的构建(可能使用临时对象),但是要由客户端直接从ConcreteBuilder调用getResult()
  • 实际上,客户端知道ConcreteBuilder (甚至可能是实例化它),并通过引用它来调用Director

这清楚地表明,这种模式并不适用于构建部件和组装整体(毕竟,它只不过是一次简化提供所有元素的助手),而更多的是使用相同的构造部件过程返回非常不同的“表示”(类)。

真实生活中完全模式

的应用

在现实生活中,典型的用途是构建具有不同类型的实现/表示的复合对象,例如不同的图形表示/视图(例如实体/关系或UML模型)、不同的输入或输出格式(例如JSON或XML文档)或编码(例如ASCII 16/32)。

例如,一个具体的用途可以是ADO.net和DbCommandBuilder,它由具体的SqlCommandBuilderOracleCommandBuilderODBCCommandBuilder实现,以生成特定于db的命令。

票数 10
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/330758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档