建造者模式的正确使用方法

4
我考虑在我的应用程序中使用构建器模式来创建复杂的对象。然而,我担心它是否是正确的模式。
this example为例;我们可以看到创建了几个具体的PizzaBuilders,这很好地工作。然而,在我的应用程序中,我需要能够传递一些与正在构建的内容相关的信息。例如,在PizzaBuilders的情况下,我需要创建一个自定义披萨,用户可以选择某些东西,如酱料配料。值得注意的是,我需要传递给构建器的信息会有所不同。
请问我是否正在寻找解决此问题的正确模式,或者是否有其他更适合的模式?如果这是解决问题的正确模式,请问将信息传递给构建器的最清晰的方法是什么?是在实例化的时候吗?
4个回答

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()方法中进行任何必要的一致性检查。

如果需要结果的类型安全性,可以使用buildCustomPizza()方法返回自定义的Pizza类型。


2
听起来建造者模式是你需要的。在维基百科文章中,我们可以看到不同的预定义构建器。然而,这并不是使用建造者模式的唯一方式。
你肯定可以使用它创建自定义对象,其强项之一是它允许你原子化地创建复杂对象,而无需定义多个构造函数,从而使代码更易于维护。请记住,如果没有足够的复杂性来证明使用此模式,可能会过度设计。
查看Joshua Bloch的《Effective Java》中对此模式的描述,以获得更全面的解释。 这里有一篇关于它的文章

2
例如,在PizzaBuilders的情况下,我需要有创建自定义披萨的能力,让用户可以选择某些内容,比如酱料和配料。
“可以选择”表示这些是可选元素。在这里,建造者模式非常适合使用。除非你在问题中省略了某些内容。

1
Builder不是一种一流的模式,因此有时很难证明其使用。您可能找不到令人信服的理由来使用它。

如果您想确保对象构造是原子的,则可以使用它。考虑使用setter方法构造bean对象的Java方式。在这种情况下,问题在于,如果您忘记设置一个属性,则对象将不处于一致的状态。除非您获得一些不一致的应用程序行为,否则无法弄清楚这一点。

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

因此,如果您的要求是创建/构建对象,并且您具有多个属性,则可以选择此模式。

编辑

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接