我的构建器是否需要在它构建的类中?

时间:2012-07-24 11:03:21

标签: java design-patterns builder-pattern

我刚刚阅读了example的精彩builder pattern

在我的程序中,我正在创建一系列的playerCharacter实体,这些实体可以以各种方式构建,包含一些必填字段,一些可以作为额外字段添加或在后面添加(在构建之后)。因此,在阅读上述帖子后,似乎我需要一个构建器模式。

我是否可以选择构建器和超类(在此示例中,Pizzabuilder)共享某些方法? 是否有一个整洁的,已知的解决方案?

例如,如果在上面的例子(比萨饼)中,我们有一个Boolean isPizzaCold()void heatTo(int degrees)的方法,我们希望比萨饼在开始时返回假,如它“建立”了热,后来让披萨'变冷',以便冷却。我该如何做到这一点,他们共享相同的方法?

[ edit :根据Joeri's建议我更改了方法示例。]

2 个答案:

答案 0 :(得分:1)

我真的没有看到你的问题和构建器模式之间的关系。如果您想要方法setTemperature()和方法isCold(),只需将它们添加到披萨:

private static final int COLD_THRESHOLD = 40;
private int temperature = 70;

public void setTemperature(int temperature) {
    this.temperature = temperature;
}

public boolean isCold() {
    return temperature <= COLD_THRESHOLD;
}

答案 1 :(得分:1)

如果您将建筑师带出课堂,它仍然是建筑师。构建器首先是构建对象的便捷方式,并不总是唯一的方法。你甚至可以说创建一个对象显然是一个单独的责任,并且将它分开是更清晰的(就像工厂 - 构建器模式相结合)。我个人认为这主要取决于创作的复杂性。

不,您的对象和构建器类无法共享方法。共享方法的唯一方法是通过继承,这显然不能在这里使用。

你的构建器是一个一次性对象,它构造的对象显然是一个不同的类。您唯一能做的就是存储请求的值,并在构建对象后自动调用相应的setter。

void setTemperature(int t){
  this.temperature = t;
}

Pizza build() {
   Pizza pizza = new Pizza(... usual constructor stuff);
   pizza.setTemperature(temperature);
   return pizza;
}

另外,我想知道void setTemperature(int)是否有意义。 void heatTo(int degrees)对我来说更有意义:)