Java 流畅的界面和构建器模式之间有什么区别?
我对设计模式非常陌生,在与构建器模式之间的差异方面遇到了问题 我理解流畅界面的概念。但是构建器模式有点混乱。我无法理解在构建器模式中如何使用控制器 我可以同时使用Builder模式和Fluent界面吗?如果是这样的话,那么我应该如何与一名主管和一名混凝土建筑商合作 我的问题是而不是关于builder模式的优点。但这个问题的目的是了解构建器模式和fluent界面之间的关系Java 流畅的界面和构建器模式之间有什么区别?,java,oop,design-patterns,Java,Oop,Design Patterns,我对设计模式非常陌生,在与构建器模式之间的差异方面遇到了问题 我理解流畅界面的概念。但是构建器模式有点混乱。我无法理解在构建器模式中如何使用控制器 我可以同时使用Builder模式和Fluent界面吗?如果是这样的话,那么我应该如何与一名主管和一名混凝土建筑商合作 我的问题是而不是关于builder模式的优点。但这个问题的目的是了解构建器模式和fluent界面之间的关系 使用GoF中生成器的UML序列图进行编辑: 流畅界面背后的理念是,通过点连接对象,可以将多个属性应用于对象,而无需每次重新指
使用GoF中生成器的UML序列图进行编辑:
流畅界面背后的理念是,通过点连接对象,可以将多个属性应用于对象,而无需每次重新指定对象。构建器模式背后的思想是,非共享可变对象通常比非共享不可变对象更容易处理,但对共享不可变对象的推理要比共享可变对象容易得多。因此,代码可以使用一个易于使用的可变对象来生成所需实例的“模型”,然后使用它来创建一个易于共享的、包含相同数据的不可变对象 这两个想法可以很好地结合在一起,但在某种程度上是正交的 请注意,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()
?流畅的接口对易变性或