Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 工厂模式示例-需要以下代码的解决方案_Java_Design Patterns - Fatal编程技术网

Java 工厂模式示例-需要以下代码的解决方案

Java 工厂模式示例-需要以下代码的解决方案,java,design-patterns,Java,Design Patterns,当我运行这段代码时,我得到了null指针,因为hashmap中没有注册任何产品。所以,当我请求pencil的产品实例时,它找不到任何键来返回我具体的pencil类对象。有人能帮我编码吗?就像工厂和具体类之间不应该有任何直接关系一样,这样注册将保持在Factory类之外,我应该得到我请求的适当的具体类对象 谢谢 Balaji您正在创建FactoryClass的单独实例-每个实例中都有自己的Map products实例-您在主方法中创建的工厂与您创建并注册笔和铅笔的工厂不同。显然,FactoryCl

当我运行这段代码时,我得到了null指针,因为hashmap中没有注册任何产品。所以,当我请求pencil的产品实例时,它找不到任何键来返回我具体的pencil类对象。有人能帮我编码吗?就像工厂和具体类之间不应该有任何直接关系一样,这样注册将保持在Factory类之外,我应该得到我请求的适当的具体类对象

谢谢
Balaji

您正在创建FactoryClass的单独实例-每个实例中都有自己的Map products实例-您在主方法中创建的工厂与您创建并注册笔和铅笔的工厂不同。显然,FactoryClass.products中没有注册的项目

一种方法是将FactoryClass中的Map产品声明为静态的,这将解决您眼前的问题,即使作为一个整体,您的代码在其他地方似乎需要其他改进。

两个问题:

首先,工厂方法应该是静态的,或者位于与所创建的类不同的类中。因此,拥有一个接口,其唯一的方法是创建接口的实例,这并不是真正合乎逻辑的。您可能会遇到这样的情况:InterfaceA创建InterfaceB的实例,或者interface是generic FactoryInterface并创建X的实例。请参阅Guava的interface

以钢笔为例。。。无法调用Pen.createProduct,除非您已经有Pen实例,因为该方法不是静态的

以上给出的考虑,让您的工厂带生产商或供应商创建X.

实例。 第二,考虑让你的工厂类成为单独的一个。您面临的问题是,每个静态初始化都会创建一个新的工厂实例,该实例会立即被丢弃。因此,当您稍后尝试获取映射值时,您是从一个不同的实例获取该值,而不是从注册该值的实例获取该值


最后,在以某种方式使用/接触类之前,不会调用类的静态初始值设定项。您需要调用Pen和Pencil上的某些内容,以调用它们的静态初始值设定项块,从而注册它们自己。

除了上面的答案外,还说明: 我们必须确保在工厂要求注册之前加载了具体的产品类。如果未加载,则不会在工厂中注册,并且createProduct将返回null。为了确保这一点,我们将在主类的静态部分使用Class.forName方法

package com.factory;

//Interface Product
public interface ProductInt {
    ProductInt createProduct();
}

// Concrete Product-1
class Pen implements ProductInt {
    static {
        FactoryClass factory = new FactoryClass();
        factory.registerProduct("pen", new Pen());
    }

    public ProductInt createProduct() {
        return new Pen();
    }
}

// Concrete Product-2
class Pencil implements ProductInt {
    static {
        FactoryClass factory = new FactoryClass();
        factory.registerProduct("pencil", new Pencil());
    }
    public ProductInt createProduct() {
        return new Pencil();
    }

}

我得到空指针:在哪里,由什么引起的?
package com.factory;

//Interface Product
public interface ProductInt {
    ProductInt createProduct();
}

// Concrete Product-1
class Pen implements ProductInt {
    static {
        FactoryClass factory = new FactoryClass();
        factory.registerProduct("pen", new Pen());
    }

    public ProductInt createProduct() {
        return new Pen();
    }
}

// Concrete Product-2
class Pencil implements ProductInt {
    static {
        FactoryClass factory = new FactoryClass();
        factory.registerProduct("pencil", new Pencil());
    }
    public ProductInt createProduct() {
        return new Pencil();
    }

}
class Main {

static
{
    try
    {
        Class.forName("OneProduct");
        Class.forName("AnotherProduct");
    }
    catch (ClassNotFoundException any)
    {
        any.printStackTrace();
    }
}
public static void main(String args[]) throws PhoneCallNotRegisteredException
{
    ...
}
}