Java 构建器模式,用于构建可以具有不同类型的类的实例
考虑以下来自维基百科的产品和AbstractBuilder:Java 构建器模式,用于构建可以具有不同类型的类的实例,java,design-patterns,Java,Design Patterns,考虑以下来自维基百科的产品和AbstractBuilder: /** "Product" */ class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void setDough(String dough) { this.dough = dough;
/** "Product" */
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";
public void setDough(String dough) {
this.dough = dough;
}
public void setSauce(String sauce) {
this.sauce = sauce;
}
public void setTopping(String topping) {
this.topping = topping;
}
}
/** "Abstract Builder" */
abstract class PizzaBuilder {
protected Pizza pizza;
public Pizza getPizza() {
return pizza;
}
public void createNewPizzaProduct() {
pizza = new Pizza();
}
public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
}
如果在类PizzaBuilder
中看到方法createNewPizzaProduct
如果Pizza实现了一个接口,比如说Foo
,并且必须实现一个方法bar
,那么方法createNewPizzaProduct
将如何解释这一点,因为将有许多不同类型的Pizza
什么是最优雅的解决方案,这样就不会违反模式?这种模式对我来说是新的
createNewPizzaProduct
不必关心Pizza
类是否实现了特定的方法:它唯一的责任是实例化Pizza
。如果你问它将如何处理基于某些标准创建不同比萨饼实现的可能性,然后您需要查看工厂模式。createNewPizzaProduct
不必关心Pizza
类是否实现了特定的方法:它的唯一职责是实例化Pizza
。如果你问它将如何处理基于某种标准创建不同比萨饼实现的可能性,那么你需要研究工厂模式。然后我将使用FooBuilder
而不是PizzaBuilder
,并使所有的生成器方法返回Foo
。createNewPizzaProduct
方法将被称为createNewFooProduct
@Adarshr那么你是说我将为所有不同类型的Foo
实例提供一个抽象生成器?另外,createNewFooProduct
方法不应该变得抽象吗?因为我们希望具体的构建器为不同的Foo
实例实现此方法?那么我将使用FooBuilder
而不是PizzaBuilder
,并使所有构建器方法返回Foo
。createNewPizzaProduct
方法将被称为createNewFooProduct
@Adarshr那么你是说我将为所有不同类型的Foo
实例提供一个抽象生成器?另外,createNewFooProduct
方法不应该被抽象化吗,既然我们希望具体的构建器为不同的Foo
实例实现此方法?那么构建器模式在这里根本不适用?我是否可以将方法createNewPizzaProduct
抽象化,然后让不同的Foo
构建器实现此方法?我不是在抱怨,我只是想了解如何在不违反原则的情况下处理这个问题pattern@Joeblackdev:生成器模式与Factory模式完全兼容。正如你所说,你可以让不同的建筑商生产不同类型的比萨饼。您可以使createNewPizzaProduct
将枚举作为参数,并打开该参数。或者您可以让它采用实际的类类型,并通过反射生成实例。或者您可以将工厂注入到PizzaBuilder中,createNewPizzaProduct
可以使用。根据您的具体需求和偏好,有很多选项。因此,构建器模式在这里根本不适用?我是否可以将方法createNewPizzaProduct
抽象化,然后让不同的Foo
构建器实现此方法?我不是在抱怨,我只是想了解如何在不违反原则的情况下处理这个问题pattern@Joeblackdev:生成器模式与Factory模式完全兼容。正如你所说,你可以让不同的建筑商生产不同类型的比萨饼。您可以使createNewPizzaProduct
将枚举作为参数,并打开该参数。或者您可以让它采用实际的类类型,并通过反射生成实例。或者您可以将工厂注入到PizzaBuilder中,createNewPizzaProduct
可以使用。根据您的具体需求和偏好,有很多选择。