Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 在哪里使用构建器模式而不是抽象工厂?_Language Agnostic_Design Patterns_Builder Pattern - Fatal编程技术网

Language agnostic 在哪里使用构建器模式而不是抽象工厂?

Language agnostic 在哪里使用构建器模式而不是抽象工厂?,language-agnostic,design-patterns,builder-pattern,Language Agnostic,Design Patterns,Builder Pattern,我已经看到这个问题在这里和那里出现了好几次,但我从来没有找到我满意的答案 来自维基百科: Builder专注于逐步构建复杂对象。抽象工厂强调一系列产品对象(简单或复杂)。生成器返回产品是最后一步,但就抽象工厂而言,产品会立即返回 但对客户来说,这不是一回事吗?一旦构建了完整的对象,他就得到了它,因此对他来说没有附加的功能 我认为这是一种逐步组织构造函数代码的方法,以强制构造器实现的结构。这很好,但离抽象工厂不远 维基百科的下一篇文章很好地说明了我的观点: 通常,设计从使用工厂方法开始(不太复杂

我已经看到这个问题在这里和那里出现了好几次,但我从来没有找到我满意的答案

来自维基百科:

Builder专注于逐步构建复杂对象。抽象工厂强调一系列产品对象(简单或复杂)。生成器返回产品是最后一步,但就抽象工厂而言,产品会立即返回

但对客户来说,这不是一回事吗?一旦构建了完整的对象,他就得到了它,因此对他来说没有附加的功能

我认为这是一种逐步组织构造函数代码的方法,以强制构造器实现的结构。这很好,但离抽象工厂不远


维基百科的下一篇文章很好地说明了我的观点:

通常,设计从使用工厂方法开始(不太复杂,更可定制,子类激增),并随着设计师发现需要更大灵活性的地方而向抽象工厂、原型或构建器(更灵活,更复杂)发展

如果是这样的话,那么在您的系统中引入什么样的复杂性,您将从一个抽象工厂变成一个构建器


我的观点是,我找不到一个明确的例子,说明抽象工厂不够用,你需要一个建设者来代替。

抽象工厂适用于一系列相关产品。建设者是为一种产品设计的

生成器用于一步一步地构建复杂的产品,而AbstractFactory用于以抽象的方式(即,一次用于多个实现)构建不太复杂的产品


差异对调用代码意味着什么的示例:

  • 对于使用AbstractFactory的客户端代码,每个方法调用构建一个对象。客户必须将它们组装在一起。另一方面,构建者将在内部组装它们,并在构建的最后一步交付完整的对象图

  • 生成器允许为客户端代码逐个传递和检查参数。但他可以在一个步骤中构建最终产品(例如,调用构造函数,一次传递所有参数,甚至是自己构建的复杂参数)。因此,构建器的产品可能是一个不可变的对象(或图形)(出于性能和内存方面的原因,这在多线程环境中是无价的)


针对此评论更新了

不过,这仍然困扰着我:)。我的意思是,如果您正在构建复合对象,并且您将控制器带出,将调用构建器方法的责任传递给客户机,那么它对我来说是有效的。只有到那时,建筑商才显得非常合适。但是对于导演来说,这看起来不太像

确切地说,构建者没有总监,它让每个客户根据其特定需求创建一个复杂的产品。客户机是控制器,因为控制器的实现没有被重用

如果您需要多次重用一个复杂的构建过程,那么您可以有一个方法来封装它(这个方法就是您的“控制器”)


相反,对于AbstractFactory,您通常需要一个可重用的控制器,该控制器创建的产品与AbstractFactory实现类似。

Builder对于配置非常有用。当您不希望调用方关心实际实现时,抽象工厂非常有用。两个不同的目的


事实上,你可以混合这两种模式。例如,Java是一个典型的抽象工厂:如果您阅读文档,您将看到它用于选择实现的过程。但是,它生成的s可以在以后进行配置(尽管它们不遵循让每个配置方法返回所配置对象的原型“构建器”方法)。

当我需要构建多个子工厂来创建不同类型的对象时,我使用抽象工厂。这些子工厂都实现或扩展了抽象工厂。当只需要构建一种类型的对象时,我使用生成器


我不确定这是否是正确的用法,但这是我所看到的,以及我过去是如何做到的。

一个很好的例子是,如果您是基于命令行参数逐块构建某个构建器,那么您需要一个构建器。例如,考虑一个生成器的方法,比如…

setName()
setType()
setOption()

建筑商也可以与抽象工厂相结合,在抽象工厂中,厂长要求工厂提供具体产品。同样,这可以通过将args列表传递给工厂来实现,但是如果args是来自服务器或客户机的消息呢


有时,一种模式的美学比另一种模式的美学更合适。

这里已经有了一些非常好的答案。我只是打个比方

比如说你想要一张新办公桌。你去一个“工厂”,看到选择,然后选择一个货架。如果它符合你的需要,那就太好了

现在你有了一个更大的办公室,有着非常奇特的墙。现在你需要一张顶部形状适合你办公室的桌子。你想要一个不同的腿来适应其余的家具,也适合你的新Aeron椅子

你回到同一家工厂,运气不好。你去找一个木匠,他可以定制你想要的东西。你给出了你的规格和要求,“建筑商”会告诉你某些限制。经过几次迭代,您得到了完美的办公桌


好吧,这是一个蹩脚的故事,但只是为了让事情变得轻松:p

Builder是一个控制反转,就像模板方法模式一样。混凝土生成器上的各种功能是流程中可自定义的步骤。抽象工厂是“正义”多态性,wh