用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();