gpt4 book ai didi

Java工厂模式如何让具体产品实例化自己

转载 作者:行者123 更新时间:2023-12-01 23:35:59 27 4
gpt4 key购买 nike

我借用了以下大部分代码(从//start 开始) http://www.oodesign.com/factory-pattern.html

我的问题是,除非我调用,否则 ProductOne 类中的注册不会发生Class.forName("ProductOne")在客户端代码中。

是否可以使 ProductOne 成为独立的?换句话说,所以我的客户端代码只有

public class Main {
public static void main(String[] args) {
Product p = ProductFactory.instance().createProduct("ID1");
}
}

不抛出 NullPointerException?非常感谢!

//start

import java.util.HashMap;

public class ProductFactory {
private static ProductFactory instance;
private HashMap m_RegisteredProducts = new HashMap();

private ProductFactory()
{
System.out.println("ProductFactory(): Initializing Instance");
}

public static ProductFactory instance()
{
if (instance==null)
instance = new ProductFactory();

return instance;
}

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

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

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

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

public ProductOne()
{
System.out.println("Initializing ProductOne");
}

@Override
public Product createProduct() {
return new ProductOne();
}
}

public class Main {
static {
try
{
Class.forName("ProductOne");
}
catch (ClassNotFoundException any)
{
any.printStackTrace();
}
}

public static void main(String[] args) {
Product p = ProductFactory.instance().createProduct("ID1");
}
}

最佳答案

这是 Java 类模型的一个基本限制;在类加载之前,向工厂注册类的静态初始值设定项不会运行。

此问题的最佳解决方案通常是 Service Provider Interface ,它允许您列出在 jar 中实现某些接口(interface)的类,然后扫描所有匹配的实现。

关于Java工厂模式如何让具体产品实例化自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18706199/

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