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