1 回答
TA贡献1802条经验 获得超10个赞
您需要两个实例的原因是您在调用createProduct()方法时使用了多态性。也就是说,每个具体产品都有自己的实现createProduct(),您可以使用该方法以相同的方式创建所有产品,因为它们都继承自同一个抽象类。
但要做到这一点,你需要有实例。您不能将多态性与静态方法一起使用。您只能覆盖实例方法。因此,您需要一个实例来创建一个实例。
但是,实例不必与它创建的类型相同。它只需要是实现所需方法的类的实例。在 Java 8 中,您可能会使用Supplier<Product>.
abstract class Product
{
...
}
class OneProduct extends Product
{
...
static
{
ProductFactory.instance().registerProduct("ID1", OneProduct::new);
}
...
}
class ProductFactory
{
Map<String,Supplier<Product>> m_RegisteredProducts = new HashMap<>();
public void registerProduct(String productID, Supplier<Product> p) {
m_RegisteredProducts.put(productID, p);
}
public Product createProduct(String productID){
// There should be a null check here...
return m_RegisteredProducts.get(productID).get();
}
}
本质上,方法引用为您提供了一个实现 的小对象,Supplier<Product>您可以在其上调用get(),它将使用默认构造函数创建一个新产品。
你提到的文章很老了。我相信它早于 Java 1.2,因为它仍然使用 aHashtable而不是现代地图,并且没有泛型。原则保持不变,但有更现代的实施方式。
添加回答
举报
