4

我正在考虑使用在我的应用程序builder pattern中创建复杂objects的。但是,我担心它是否是正确的使用模式。

举个例子;在这里,我们看到PizzaBuilders正在创建的几个混凝土效果很好。但是,在我的应用程序中,我需要能够传递一些与正在构建的内容相关的信息。例如,在我的情况下,PizzaBuilders我需要创建一个custom pizza用户可以选择某些东西的能力,例如saucetoppings. 值得注意的是,我需要传递给构建器的信息会有所不同。

请您告知我是否正在考虑使用正确的模式来解决这个问题,或者是否有其他更适合的模式?如果这是问题的正确模式,那么请您建议将信息传递给建设者的最干净的方式吗?它会在实例化点吗?

4

4 回答 4

2

听起来您需要构建器模式。在该维基百科文章中,我们可以看到不同的预定义构建器。然而,这不是使用 Builder 模式的唯一方法。

您当然可以使用它创建自定义对象,它的优点之一是它允许您以原子方式创建复杂的对象,而无需定义多个构造函数,从而产生更多可维护的代码。请记住,如果没有足够的复杂性来保证使用这种模式,它可能是矫枉过正的。

查看 Joshua Bloch 的 Effective Java 中对这种模式的描述以获得更全面的解释。这是一篇关于它的文章

于 2013-04-27T13:00:43.777 回答
2

例如,在 PizzaBuilders 的情况下,我需要能够创建自定义比萨,用户可以在其中选择某些东西,例如酱汁和浇头

可以选择- 这些表示可选元素。Builder 模式在这里将是完美的。除非您在问题中省略了某些内容。

于 2013-04-27T13:11:16.087 回答
2

我猜你可以使用类似的东西:

// normal pizza:
Pizza normalPizza=PizzaBuilder.aPizza().withCheese().withSalami().build();

// custom pizza
Pizza customPizza=PizzaBuilder.aCustomPizza().withAnchovis().withHotSauce().withExtraCheese().withoutGarlic().build();

只要 build() 返回一个 Pizza 对象(或合适的子类),构建器将在内部做什么取决于实现。您还可以在 with... 方法或 build() 中进行所需的任何一致性检查。

如果您需要 Typesafety 的结果,您可以使用 buildCustomPizza() 返回您的自定义 Pizza 类型。

于 2013-04-27T13:12:23.410 回答
1

Builder is not a grade A pattern, so it's tough to justify its usage sometime. And you might not find convincing reason to use it.

如果您想确保您的对象构造是原子的,则使用它。考虑使用 setter 方法构造 bean 对象的 Java 方法。在这种情况下,问题在于,如果您错过设置一个属性,那么对象将不会处于一致状态。除非你得到一些不一致的应用程序行为,否则没有办法解决这个问题。

因此,当有 3 个属性并且您希望对象创建是原子的时,您应该使用 Builder 模式。我曾经用它来创建 REST url,例如BASE_URL/param1/param2/param3.

因此,如果您的要求是关于创建/构建一个对象并且您有多个属性,那么您可以采用这种模式。

编辑

关于实施;我遵循了与维基百科相同的方法。

于 2013-04-27T12:56:05.087 回答