2013-04-27 72 views
4

我正在考虑使用builder pattern以在我的应用程序中创建复杂的objects。不过,我担心这是否是正确的使用模式。正确使用生成器模式

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

请你能建议我是否正在寻找使用正确的模式解决这个问题,或者是否有其他更适合的方法?如果这是问题的正确模式,那么请您建议您使用最简洁的方式将信息传递给建设者?它会在实例化的地步吗?

回答

2

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

你当然可以用它创建自定义对象,它的一个优点是它允许你自动创建复杂对象,而无需定义多个构造器,这导致了更多的可支持代码。请记住,如果没有足够的复杂性来保证使用这种模式,它可能是矫枉过正的。

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

0

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方法。在这种情况下,问题在于,如果您错过了设置一个属性,那么对象将不会处于一致的状态。除非你得到一些不一致的应用程序行为,否则没有办法解决这个问题。

所以你应该使用Builder模式,当有像3个属性,你想创建对象的原子。我曾经使用过它来创建REST url,如BASE_URL/param1/param2/param3

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

编辑

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

2

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

可以选择的能力 - 这些意味着可选元素。 Builder模式在这里是完美的。 除非你在你的问题中省略了一些东西。

2

我想你可以使用类似:

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

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

什么建设者将在内部做的是到执行,只要建立()返回一个比萨对象(或合适的子类)。您还可以在with ...方法或build()中进行任何一致性检查。

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