Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成器模式的正确使用_Java_Design Patterns_Builder Pattern - Fatal编程技术网

Java 生成器模式的正确使用

Java 生成器模式的正确使用,java,design-patterns,builder-pattern,Java,Design Patterns,Builder Pattern,我正在考虑使用builder模式,以便在我的应用程序中创建复杂的对象。然而,我担心这是否是正确的模式使用 采取;在这里,我们看到一些具体的PizzaBuilders正在创建中,它们工作得很好。然而,在我的应用程序中,我需要能够传递一些与正在构建的内容相关的信息。例如,在比萨制作者的情况下,我需要能够创建一个定制比萨,用户可以在其中选择某些东西,例如酱汁和配料。值得注意的是,我需要传递给构建者的信息会有所不同 请您告诉我,我是否正在考虑使用正确的模式解决这个问题,或者是否有其他更适合的模式?如果这

我正在考虑使用
builder模式
,以便在我的应用程序中创建复杂的
对象
。然而,我担心这是否是正确的模式使用

采取;在这里,我们看到一些具体的
PizzaBuilders
正在创建中,它们工作得很好。然而,在我的应用程序中,我需要能够传递一些与正在构建的内容相关的信息。例如,在
比萨制作者
的情况下,我需要能够创建一个
定制比萨
,用户可以在其中选择某些东西,例如
酱汁
配料
。值得注意的是,我需要传递给构建者的信息会有所不同


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

Builder不是a级模式,所以有时很难证明它的使用是正确的。您可能找不到令人信服的理由使用它。

如果您想确保对象构造是原子的,那么可以使用它。考虑java方法,使用SETTER方法构造Bean对象。在这种情况下,问题在于,如果您没有设置一个属性,那么对象将不会处于一致状态。除非您得到一些不一致的应用程序行为,否则无法了解这一点

所以,当有3个属性并且希望对象创建是原子的时,应该使用生成器模式。一段时间前,我使用它创建了RESTURL,比如
BASE\uURL/param1/param2/param3

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

编辑


关于执行;我采用了与维基百科相同的方法

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

您当然可以使用它创建自定义对象,它的一个优点是,它允许您以原子方式创建复杂对象,而无需定义多个构造函数,这将导致更易于维护的代码。请记住,如果没有足够的复杂性来保证使用此模式,则可能是过火了

请查看Joshua Bloch的《有效Java》中对此模式的描述,以获得更全面的解释

例如,对于PizzaBuilders,我需要能够创建自定义比萨,用户可以在其中选择某些东西,例如酱汁和配料

可以选择-这些表示可选元素。构建器模式在这里是完美的。
除非你的问题遗漏了什么

我想您可以使用以下内容:

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

// custom pizza
Pizza customPizza=PizzaBuilder.aCustomPizza().withAnchovis().withHotSauce().withExtraCheese().withoutGarlic().build();
只要build()返回一个Pizza对象(或合适的子类),构建器在内部将做什么取决于实现。您还可以在中使用…执行所需的任何一致性检查。。。方法或在生成()中

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