这个直接来自Effective java 2.我不确定第2项中的这个陈述是什么意思
Builder模式非常灵活。可以使用单个构建器来构建 多个对象。可以在两者之间调整构建器的参数 对象创作来改变对象。
我无法想出一个例子来做到这一点。 请举例说明一下。
答案 0 :(得分:6)
This博客文章提供了JavaFX 2 API使用的构建器对象的一个很好的示例。
单个构建器可用于构建多个对象。
构建器对象负责构造有效对象,但是在调用build()
方法之前不会构造对象。这意味着可以多次使用相同的构建器来完全构造不同的对象。
示例:强>
final TextBuilder builder = TextBuilder.create()
final Text text1 = builder
.text("Hello World!")
.x(50).y(50)
.fill(Color.WHITE)
.font(MY_DEFAULT_FONT)
.build();
final Text text2 = builder
.text("Goodbye World!")
.x(50).y(100)
.fill(Color.WHITE)
.font(MY_DEFAULT_FONT)
.build();
这可以根据您想要创建不同对象的次数来完成。只是为了重新迭代在调用build()
方法之前未创建对象的点,请考虑您可以执行以下操作:
final Text text1 = TextBuilder.create()
.text("Hello World!")
.text("Goodbye World!")
.text("Hello There!")
.build();
将导致创建一个对象,文本设置为“Hello There”,因为这是调用build()
方法之前的属性值。
可以在对象创建之间调整构建器的参数 改变对象。
以下示例说明了这一点。
// Set the properties that are common to all objects.
final TextBuilder builder = TextBuilder.create()
.x(50)
.fill(Color.WHITE)
.font(MY_DEFAULT_FONT);
// Use the builder to construct different objects that have the
// properties set above as well as the additional ones set here.
final Text text1 = builder.text("Hello World!").y(50).build();
final Text text2 = builder.text("Goodbye World!").y(100).build();
final Text text3 = builder.text("JavaFX is fun!").y(150).build();
答案 1 :(得分:0)
如果你想建造你需要的房子:墙壁,地板,楼梯,窗户...... 创建HouseBulder类时,可以在HousBuilder类中创建所有这些对象。因此,“想要房子的用户”不必了解这些物体:墙壁,地板,......以及必须以何种顺序构建。
答案 2 :(得分:0)
Builder pattern构建Complex对象(Complex对象是许多对象的组合,它逐个构建每个对象),最后返回复杂对象。
物体的建造应该非常通用。“Micho”给出了房屋建筑的一个很好的例子。你必须以这样的方式制作HouseBuilder类,使得任何新的HouseBuilder对象可以与其他HouseBuilder对象不同。也就是说,一个人想在他家里面用楼梯建房子,而另一个人则希望他的房子里面没有楼梯。所以你的复杂对象应该非常通用。