2012-07-24 17 views
3

我刚刚读了builder pattern的奇幻example我的建造者是否需要在它建造的类中?

在我的程序中,我创建了一系列playerCharacter实体,它可以用各种方式构建,有一些必填字段,还有一些可以作为额外添加或添加在后(建设后)。所以,在阅读了上述文章后,似乎我需要一个构建器模式。

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

例如,如果在(的比萨饼)上面的例子中,在以后的时间,我们不得不的Boolean isPizzaCold()void heatTo(int degrees)的方法,我们希望比萨返回false下手,因为它的“建”热,然后让披萨“变凉”,以便它变凉。我如何做到这一点,使他们分享相同的方法?

[edit:按Joeri's建议,我已经改变了方法示例]

回答

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)对我更有意义:)

+0

我将如何委托方法?这听起来是正确的。 – Pureferret 2012-07-24 11:50:37

+0

对不起,不委托方法;你不能使用那些,因为你还没有你的对象:)我更新了答案。 – 2012-07-24 12:26:28

+0

不打破模式?我认为你的代码让我感到困惑,这是'Builder'还是'Pizza'类的方法?为什么它附有一个构造函数? – Pureferret 2012-07-24 12:44:45

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; 
} 
+0

在示例show中,builder是一个嵌套的抽象类,(super)pizza类中没有方法。我如何让他们分享一部分方法? – Pureferret 2012-07-24 11:12:58

+1

否。在示例中,Builder是一个公共静态内部类,不是抽象的,并且没有超类:Builder不扩展Pizza。他们根本不会分享任何方法。比萨中的方法只是没有写出来保持简洁的例子,但比萨应当有方法,但它没有任何用途。建造者的领域只是在施工时被复制到比萨的领域。 – 2012-07-24 11:23:37

+0

但是,如果我确实希望他们分享方法(尽管可能在这里*比萨*不是,曾经是最好的例子),无论出于何种原因呢? – Pureferret 2012-07-24 12:54:46

相关问题