gpt4 book ai didi

java - 用反射实现工厂模式

转载 作者:搜寻专家 更新时间:2023-11-01 03:21:02 25 4
gpt4 key购买 nike

我正在实现工厂模式 这是我的工厂类:

class ProductFactory
{
private HashMap m_RegisteredProducts = new HashMap();

public void registerProduct (String productID, Class productClass)
{
m_RegisteredProducts.put(productID, productClass);
}

public Product createProduct(String productID)
{
Class productClass = (Class)m_RegisteredProducts.get(productID);
Constructor productConstructor = cClass.getDeclaredConstructor(new Class[] { String.class });
return (Product)productConstructor.newInstance(new Object[] { });
}
}

这是我的具体类(class):

class OneProduct extends Product
{
static {
Factory.instance().registerProduct("ID1",OneProduct.class);
}
...
}

我的问题:

  1. 我如何强制所有具体实现注册一个 ID 及其类对象? - 因为如果类没有像这样在工厂中注册自己,那么它就无法使用。

  2. 我不能使用一个抽象类,它以某种方式要求它的所有子级将其名称和 ID 发送给父级,以强制执行此约束吗?像这样:

    public abstract class Product {

    public Product(String name, Class productClass){


    }
    }

我在这里遗漏了什么吗?

最佳答案

在 Java 8 中你会这样写

class ProductFactory {
private final Map<String, Function<String, Product>> m_RegisteredProducts =
new HashMap<>();

public ProductFactory registerProduct (String productID,
Function<String, Product> productFactory) {
m_RegisteredProducts.put(productID, productFactory);
return this;
}

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

注册

static {
Factory.instance().registerProduct("ID1", OneProduct::new)
.registerProduct("ID2", s -> new OneProduct("my" + s));
.registerProduct("ID3", s -> {
throw new AssertionError("Never create a " + s); });
}

OneProduct::news -> new OneProduct(s)

非常相似
new Function<String, Product>() {
public Product apply(String s) {
return new OneProduct(s);
}
}

注意(1):Java 8 将确保您有一个可见的OneProduct(String) 构造函数,否则将无法编译。

注(2):Java 7 结束公共(public)支持。

关于java - 用反射实现工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30601980/

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