|
|
1
1081
设计模式 . 在Java中使用它的原因也适用于其他编程语言。 正如约书亚·布洛赫在书中所说的那样 Effective Java, 2nd Edition :
我们都曾经遇到过一个类,它有一个构造函数列表,每次添加都会添加一个新的选项参数:
这称为伸缩构造函数模式。 这个模式的问题是,一旦构造函数有4或5个参数长,它就变成了 难记 必要的 参数的顺序 以及在给定情况下可能需要的特定构造函数。 一 可供替代的 JavaBean模式 其中,您使用强制参数调用构造函数,然后在以下情况下调用任何可选设置程序:
更好的选择是使用生成器模式。
注意 . 因为生成器的setter方法返回生成器对象,所以它们是 能被锁住 .
在本例中 可以修改构建方法 将参数从生成器复制到Pizza对象后检查参数,并 如果提供了无效的参数值,则引发IllegalStateException。 这种模式是灵活的,将来很容易向其添加更多参数。只有当一个构造函数的参数超过4或5个时,它才真正有用。尽管如此,从一开始这可能是值得的 如果您怀疑将来可能会添加更多参数。 关于这个话题,我从这本书中借了很多东西 有效Java,第二版 我极力推荐。 |
|
|
2
334
考虑一家餐馆。“今天的饭菜”的创建是一种工厂模式,因为你告诉厨房“给我今天的饭菜”,厨房(工厂)根据隐藏的标准决定生成什么对象。 如果您订购自定义比萨饼,则会显示生成器。在这种情况下,服务员告诉厨师(构建者)“我需要一个比萨饼;在比萨饼中添加奶酪、洋葱和培根!”因此,构建者公开了生成的对象应该具有的属性,但隐藏了如何设置它们。 |
|
3
278
生成器和factory IMHO的关键区别在于,当您需要做很多事情来构建对象时,生成器非常有用。例如,想象一个DOM。您必须创建大量节点和属性才能获得最终对象。当工厂可以在一个方法调用中轻松创建整个对象时,使用工厂。 (未显示参数) :
|
|
|
4
19
.NET StringBuilder类是生成器模式的一个很好的示例。它主要用于在一系列步骤中创建字符串。执行ToString()的最终结果始终是一个字符串,但该字符串的创建取决于StringBuilder类中使用的函数。总之,基本思想是构建复杂对象,并隐藏如何构建的实现细节。 |
|
|
5
11
对于多线程问题,我们需要为每个线程构建一个复杂的对象。对象表示正在处理的数据,并且可以根据用户输入而更改。 我们可以用工厂来代替吗?对 为什么我们没有?我想建设者更有意义。 工厂用于创建相同基本类型的不同类型的对象(实现相同的接口或基类)。 构建器反复构建同一类型的对象,但构造是动态的,因此可以在运行时更改。 |
|
|
6
11
我一直不喜欢Builder模式,因为它笨重、突兀,而且经常被经验不足的程序员滥用。它是一种模式,只有当您需要从需要的数据中组装对象时才有意义 (即,一旦收集到所有数据,就用它做点什么)。相反,在99%的时间里,构建器只是用来初始化类成员。
考虑一下:
|
|
|
7
10
当你有很多选择要处理时,你就使用它。想想像jmock这样的事情:
这感觉更自然,而且是……可能的。
还有xml构建、字符串构建和许多其他东西。想象一下如果
|
|
|
8
9
我看到使用builder模式的优点是,您可以创建自己的工厂并将其插入框架。 @特塔,可以有一家由意大利人经营的餐厅(框架),提供比萨饼。为了准备比萨饼,意大利人guy(Object Builder)使用Owen(Factory)和比萨饼基(基类)。 现在印度佬从意大利佬手中接管了餐厅。印度餐厅(框架)提供dosa而不是比萨饼。为了准备dosa Indian guy(对象生成器)使用带有Maida(基类)的煎锅(工厂)
|
|
9
7
在前面的答案(双关语)的基础上,有一个很好的现实例子
Groovy
的内置支持
|
|
|
10
6
构建器的另一个优点是,如果您有一个工厂,那么代码中仍然存在一些耦合,因为 对于工厂来说,它必须知道它可能创建的所有对象 . 如果添加另一个可以创建的对象,则必须修改factory类以包含该对象。这种情况也发生在抽象工厂中。
此外,还有许多风格的建筑商。Kamikaze雇佣军公司提供了另一个。 |
|
|
11
5
|
|
|
12
3
我在自己开发的消息传递库中使用了builder。库核心从连线接收数据,使用Builder实例收集数据,然后,一旦Builder确定它已经获得了创建消息实例所需的一切,Builder.GetMessage()将使用从连线收集的数据构造消息实例。 |
|
|
13
2
因为我工作的地方,我不允许在没有法律许可的情况下在线分享,但这里有一个客户如何使用它的例子。它抽象了XMLGregorianCalendar的细节,并过滤了XMLGregorianCalendar的一些实现,这些实现很少用于xs:datetime。
假设这个模式更像是一个过滤器,因为它将xmlCalendar中的字段设置为未定义的,所以它们被排除在外,它仍然“构建”它。我很容易地向构建器添加了其他选项,以创建xs:date和xs:time结构,并在需要时操作时区偏移。 如果您曾经看到过创建和使用XMLGregorianCalendar的代码,您将看到这如何使其更易于操作。 |