gpt4 book ai didi

java - 工厂模式: Supporting new concrete types

转载 作者:行者123 更新时间:2023-11-30 05:44:19 26 4
gpt4 key购买 nike

我正在this中学习工厂模式关联。在编写了一个普通的工厂之后,作者继续设计一个工厂,我们不必修改工厂的代码来添加新的具体实现。 (假设有一个 Product 接口(interface),工厂提供它的实现)。

为了实现这一目标,作者说:

We add a new abstract method in the product abstract class. Each concrete class will implement this method to create a new object of the same type as itself.

此代码片段如下:

 abstract class Product
{
public abstract Product createProduct();
...
}

class OneProduct extends Product
{
...
static
{
ProductFactory.instance().registerProduct("ID1", new OneProduct());
}
public OneProduct createProduct()
{
return new OneProduct();
}
...
}

class ProductFactory
{
public void registerProduct(String productID, Product p) {
m_RegisteredProducts.put(productID, p);
}

public Product createProduct(String productID){
((Product)m_RegisteredProducts.get(productID)).createProduct();
}
}

我这里有一个疑问。我们已经向工厂注册了 OneProduct 的实例。然后在运行时,我们调用 createProduct() 方法,该方法再次创建 Oneproduct 的新实例。

这是正确的做法吗?我们必须在这里创建 OneProduct两个实例,我认为这是错误的。

最佳答案

您需要两个实例的原因是,当您调用 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,因为它仍然使用 Hashtable而不是现代 map ,也没有泛型。原则保持不变,但有更现代的实现方法。

关于java - 工厂模式: Supporting new concrete types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com