Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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_Oop_Reflection - Fatal编程技术网

用java实现反射式工厂设计模式

用java实现反射式工厂设计模式,java,oop,reflection,Java,Oop,Reflection,可能重复: 我在做工厂模式的研发,我开发了以下代码。现在我知道子类是Dog和Cat,但请告诉我。如果我想通过在main.java中传递类名来通过反射实现同样的目标,该怎么办 动物 狗 猫 畜牧业 主要 请告知我如何向其中添加反射功能,这样我甚至不需要确定类型,只需在主java中传递类名,即可创建该子类的对象。如果传递该类的完整限定名,则可以如下实例化它们: public Animal getAnimal(String clName) { try { return (Animal

可能重复:

我在做工厂模式的研发,我开发了以下代码。现在我知道子类是
Dog
Cat
,但请告诉我。如果我想通过在
main.java
中传递类名来通过反射实现同样的目标,该怎么办

动物 狗 猫 畜牧业 主要
请告知我如何向其中添加反射功能,这样我甚至不需要确定类型,只需在主java中传递类名,即可创建该子类的对象。

如果传递该类的完整限定名,则可以如下实例化它们:

public Animal getAnimal(String clName) {
  try {
      return (Animal) Class.forName(clName).newInstance();
  } catch (Exception e) {
      throw new RuntimeException(e);
  }
}
return (Animal) Class.forName(fullyQualifiedClassName).newInstance();

为了避免ClassCastException,您可以在调用
newInstance()
之前测试
class.forName()
返回的类是否确实是
Animal
的子类。使用
isAssignableFrom

如果传递类的完整限定名,则可以按如下方式实例化它们:

return (Animal) Class.forName(fullyQualifiedClassName).newInstance();

为了避免ClassCastException,您可以在调用
newInstance()
之前测试
class.forName()
返回的类是否确实是
Animal
的子类。为此,请使用
isAssignableFrom

谢谢您的帮助,但也需要在main.java中进行相应的更改。例如Animal a1=animalFactory.getAnimal(“Cat”);System.out.println(“a1声音:+a1.makeSound());然后解释你的话:“只需在主java中传递类名,并创建该子类的对象”它就可以工作了……animalA1=animalFactory.getAnimal(“FactoryDesignPattern.Cat”);System.out.println(“FactoryDesignPattern.Cat:+a1.makeSound());感谢您的帮助,但是也需要在main.java中进行相应的更改。例如Animal a1=animalFactory.getAnimal(“Cat”);System.out.println(“a1声音:+a1.makeSound());然后解释你的话:“只需在主java中传递类名,并创建该子类的对象”它就可以工作了……animalA1=animalFactory.getAnimal(“FactoryDesignPattern.Cat”);System.out.println(“FactoryDesignPattern.Cat:+a1.makeSound())@Guillaume..请问main.java中还需要做哪些更改advise@user1370546这要看情况而定,要么抛出可能的异常,然后在调用工厂的任何地方捕获它们,要么在工厂方法中捕获它们。您还需要将
newInstance()
的返回值强制转换为(Animal),以便工厂方法正常。当然,你需要用合适的类名调用工厂方法。这家伙在耍我们吗??请看他给我的答案留下的评论。@MarkoTopolnik是的,我看到了。@Guillaume..main.java中还需要做哪些更改advise@user1370546这要看情况而定,要么抛出可能的异常,然后在调用工厂的任何地方捕获它们,要么在工厂方法中捕获它们。您还需要将
newInstance()
的返回值强制转换为(Animal),以便工厂方法正常。当然,你需要用合适的类名调用工厂方法。这家伙在耍我们吗??看他对我的回答留下的评论。@MarkoTopolnik是的,我看到了。
public class AnimalFactory {

    public Animal getAnimal(String type) {
        if ("canine".equals(type)) {
            return new Dog();
        } else {
            return new Cat();
        }
    }
}
public class Main {

    public static void main(String[] args) {
        AnimalFactory animalFactory = new AnimalFactory();

        Animal a1 = animalFactory.getAnimal("feline");
        System.out.println("a1 sound: " + a1.makeSound());

        Animal a2 = animalFactory.getAnimal("canine");
        System.out.println("a2 sound: " + a2.makeSound());
    }
}
public Animal getAnimal(String clName) {
  try {
      return (Animal) Class.forName(clName).newInstance();
  } catch (Exception e) {
      throw new RuntimeException(e);
  }
}
return (Animal) Class.forName(fullyQualifiedClassName).newInstance();