Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构建器模式,用于构建可以具有不同类型的类的实例_Java_Design Patterns - Fatal编程技术网

Java 构建器模式,用于构建可以具有不同类型的类的实例

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;

考虑以下来自维基百科的产品和AbstractBuilder:

/** "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
可以使用。根据您的具体需求和偏好,有很多选择。