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