正确使用构建器模式

时间:2013-04-27 12:46:38

标签: java design-patterns builder-pattern

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

this example;在这里,我们看到正在创建的几个具体的PizzaBuilders很好地工作。但是,在我的应用程序中,我需要能够传递与正在构建的内容有关的一些信息。例如,在PizzaBuilders的情况下,我需要能够创建custom pizza,用户可以选择某些内容,例如saucetoppings。值得注意的是,我需要传递给构建者的信息会有所不同。

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

4 个答案:

答案 0 :(得分:2)

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

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

在Joshua Bloch的Effective Java中查看此模式提供的描述,以获得更全面的解释。 Here's an article about it

答案 1 :(得分:2)

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

可以选择 - 这些意味着可选元素。 Builder模式在这里是完美的。 除非你在问题中省略了某些内容。

答案 2 :(得分: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类型。

答案 3 :(得分: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.

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

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

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

修改

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