如何使用单个构建器来构建多个对象?

时间:2013-01-20 20:40:02

标签: java effective-java

这个直接来自Effective java 2.我不确定第2项中的这个陈述是什么意思

  

Builder模式非常灵活。可以使用单个构建器来构建   多个对象。可以在两者之间调整构建器的参数   对象创作来改变对象。

我无法想出一个例子来做到这一点。 请举例说明一下。

3 个答案:

答案 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对象不同。也就是说,一个人想在他家里面用楼梯建房子,而另一个人则希望他的房子里面没有楼梯。所以你的复杂对象应该非常通用。