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中,如何实现类似于使用模板参数的函数,避免C++中创建创建者子类?_Java_Design Patterns_Factory Method - Fatal编程技术网

在java中,如何实现类似于使用模板参数的函数,避免C++中创建创建者子类?

在java中,如何实现类似于使用模板参数的函数,避免C++中创建创建者子类?,java,design-patterns,factory-method,Java,Design Patterns,Factory Method,最近,当我在读《可重用面向对象软件的设计模式元素》一书时,书中有这样一段话: 使用模板避免子类化。正如我们所提到的,另一个潜力 工厂方法的问题是,它们可能会迫使您只创建子类 创建适当的产品对象。用另一种方法解决这个问题 C++提供了一个模板的子类,它由 产品类别 我想知道的是:在java中,如何实现类似于使用模板参数的函数,避免C++中创建生成器子类? 我尝试过使用泛型,但我不知道如何使用它 public class ConcreteCreator<T extends Product>

最近,当我在读《可重用面向对象软件的设计模式元素》一书时,书中有这样一段话:

使用模板避免子类化。正如我们所提到的,另一个潜力 工厂方法的问题是,它们可能会迫使您只创建子类 创建适当的产品对象。用另一种方法解决这个问题 C++提供了一个模板的子类,它由 产品类别

我想知道的是:在java中,如何实现类似于使用模板参数的函数,避免C++中创建生成器子类?

我尝试过使用泛型,但我不知道如何使用它

public class ConcreteCreator<T extends Product> extends Creator{

    @Override
    public Product createProduct() {
        // ... how can I return new T();

    }
}

//。。。如何退回新的T

简单的回答是:在Java中,你不可能那么容易

java不是C++,泛型在很多方面不如C++模板强大。p> 关键是:没有办法一般地创建一些未知任意类的新对象。您可以通过使用反射、Class.forName和newInstance来解决这个问题,但这通常是以反射为代价的:它既笨拙又容易出错

当然,您可以返回一个特定的子类类型和实例,但是您必须为每个这样的类型编写一个特定的方法

//。。。如何退回新的T

简单的回答是:在Java中,你不可能那么容易

java不是C++,泛型在很多方面不如C++模板强大。p> 关键是:没有办法一般地创建一些未知任意类的新对象。您可以通过使用反射、Class.forName和newInstance来解决这个问题,但这通常是以反射为代价的:它既笨拙又容易出错


当然,您可以返回一个特定的子类类型和实例,但是您必须为每个这样的类型编写一个特定的方法

不能实例化T。它是一个占位符,在运行时将被删除。您要返回产品的具体类型,而不是返回产品。

您不能实例化T。它是一个占位符,在运行时将被删除。要返回产品的具体类型,而不是返回产品。

在java中,工厂方法已经有了通用类型。是供应商

您可能应该使用供应商而不是创建者

然后,通常使用lambda函数或方法引用来提供实例

例如,如果您想调用setCreatorSupplier,并希望它创建MyProduct子类,那么您只需调用setCreatorMyProduct::new


Lambdas允许您在不进行子类化的情况下进行更复杂的构造,即使在不存在合适的构造函数的情况下,如setCreator->new MyProductCONST_VAL_1,UtilityClass.getCurrentValue2

在java中,工厂方法已经有了泛型类型。是供应商

您可能应该使用供应商而不是创建者

然后,通常使用lambda函数或方法引用来提供实例

例如,如果您想调用setCreatorSupplier,并希望它创建MyProduct子类,那么您只需调用setCreatorMyProduct::new


Lambdas允许您在不进行子类化的情况下进行更复杂的构造,即使在不存在合适的构造函数的情况下,如setCreator->new MyProductCONST_VAL_1,UtilityClass.getCurrentValue2

你不能像你提到的那样直接做@GhostCat详细解释了它。但一般来说,如果您需要这样做,那么您的类结构很有可能被错误设计或使用了一些反模式。您不能像@GhostCat详细解释的那样直接这样做。但是一般来说,如果您需要这样做,那么您的类结构很有可能被错误设计或使用了一些反模式。