Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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
Java 流畅的界面和构建器模式之间有什么区别?_Java_Oop_Design Patterns - Fatal编程技术网

Java 流畅的界面和构建器模式之间有什么区别?

Java 流畅的界面和构建器模式之间有什么区别?,java,oop,design-patterns,Java,Oop,Design Patterns,我对设计模式非常陌生,在与构建器模式之间的差异方面遇到了问题 我理解流畅界面的概念。但是构建器模式有点混乱。我无法理解在构建器模式中如何使用控制器 我可以同时使用Builder模式和Fluent界面吗?如果是这样的话,那么我应该如何与一名主管和一名混凝土建筑商合作 我的问题是而不是关于builder模式的优点。但这个问题的目的是了解构建器模式和fluent界面之间的关系 使用GoF中生成器的UML序列图进行编辑: 流畅界面背后的理念是,通过点连接对象,可以将多个属性应用于对象,而无需每次重新指

我对设计模式非常陌生,在与构建器模式之间的差异方面遇到了问题

我理解流畅界面的概念。但是构建器模式有点混乱。我无法理解在构建器模式中如何使用控制器

我可以同时使用Builder模式和Fluent界面吗?如果是这样的话,那么我应该如何与一名主管和一名混凝土建筑商合作

我的问题是而不是关于builder模式的优点。但这个问题的目的是了解构建器模式和fluent界面之间的关系


使用GoF中生成器的UML序列图进行编辑:


流畅界面背后的理念是,通过点连接对象,可以将多个属性应用于对象,而无需每次重新指定对象。构建器模式背后的思想是,非共享可变对象通常比非共享不可变对象更容易处理,但对共享不可变对象的推理要比共享可变对象容易得多。因此,代码可以使用一个易于使用的可变对象来生成所需实例的“模型”,然后使用它来创建一个易于共享的、包含相同数据的不可变对象

这两个想法可以很好地结合在一起,但在某种程度上是正交的

请注意,fluent界面至少有三种工作方式:

  • 通过让实例的每个成员返回一个新实例,并应用适当的更改
  • 通过让每个成员对其被调用的实例进行变异并返回该实例
  • 通过让每个成员返回一个轻量级补丁对象的实例,该对象包含一个指向被修改对象或上一个补丁的链接
最后一种样式要求采取一些操作来应用所有补丁,但如果要修改的对象很大且需要进行许多更改,则可以将所需的复制量降至最低。

是语义外观。您可以将它们放在现有代码之上,以减少语法噪音,并更清楚地表达代码在通用语言中的功能。它是在构建内部领域特定语言时使用的一种模式。这是关于可读性的

导演/建设者负责组织某个项目的建设。也就是说,如果你正在建造一台比萨饼烘焙机,主管将确保从订单到比萨饼的步骤由正确的构建者以正确的顺序和正确的数据执行。这是关于验证和授权的

您当然可以在Director/Builder模式的基础上添加一个流畅的界面,使其阅读更流畅,并强调领域概念(与构建和委派的技术过程相比)。那可能是一个很好的选择

我想强调的是,流畅的界面不仅仅是。这是一个常见的误解。方法链接是实现Fluent接口的一种方法,但它不同,因为它缺乏语义特性,例如,这不是Fluent接口:

SomeObject.setFoo(1).setBar(2).setBaz(3);
上面所说的并不是关于某个对象的任何内容。它不是某种语义模型之上的一个门面。这只是一些链接的方法。流畅界面的一个例子是SQL查询生成器,例如

SQLBuilder.select('foo').from('bar').where('foo = ?', 42).prepare();

在该API的外壳下是创建SQL语句的代码。它可能包含多个对象,显示的调用可以很好地创建一个Select对象,对其调用setter,创建一个条件对象并将其应用于Select对象,最后返回一个语句对象。但我们所隐藏的一切。这也突出了Fluent接口的另一个方面:它们可能违反和。但是,由于它是一个在代码之上的外观,希望遵循这些设计原则,所以这并不重要,因为您可以将冲突定位到Fluent界面。

我可以同时使用Builder模式和Fluent界面吗?是的,你可以,有一个很好的例子张贴在更多的例子。我可以知道这个问题是如何重复上述问题吗?因为这是关于fluent界面和builder模式之间的关系。我不确定这个问题在副本中是否得到了正确的回答。许多人错误地引用了GoF Builder。来自GoF的True Builder允许扩展(添加)
ConcreteBuilder
类,而无需修改
客户端
类或
控制器
类。请看我添加到您的问题中的序列图。方法链接或fluent接口不是GoF的生成器。GoF中的示例根本不使用方法链接。在这里,作者为fluent接口调用builder模式版本1和版本2。我不确定我是否同意您对fluent接口的定义。这听起来像是方法链接。我不会投反对票,但请看我的答案,以了解Fluent接口实现了什么。-1由于Fluent接口的描述不正确/不完整,几乎没有与生成器模式相关的不变/可变对象,以及不正确的正交性声明。我当然知道。我不知道人们为什么批评你的答案,你说得很对。Fluent是一种模式,用于将方法层叠添加到没有方法层叠的语言中,并将层叠与链接相结合。我也没有看到对builder的批评,可变性/不变性是它的主要用例之一。虽然它可以用于更多的事情,比如跨方法聚合参数,进行验证等等。Didier,使用两个静态方法而不是生成器来创建对象有什么不对?我正在试图确定我的fluent对象是否真的需要一个生成器,它只有一个或两个构造序列。如果代码确实
var foo=SQLBuilder.select('foo')。from('bar');var bar=foo.where(expr1,42);foo.where(exp2,42).prepare();bar.prepare()
?流畅的接口对易变性或