java - 通过反射(reflection)思考工厂设计模式

标签 java design-patterns

我正在对工厂模式进行研发,我开发了下面的代码,现在我知道子类是 Dog 和 Cat ,但是如果我想通过传递类名通过反射实现同样的事情,请告诉我该怎么做在main.java中

    public abstract class Animal {
    public abstract String makeSound();
}

public class Dog extends Animal {

    @Override
    public String makeSound() {
        return "Woof";
    }

}

public class Cat extends Animal {

    @Override
    public String makeSound() {
        return "Meow";
    }

}

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

}

请告知我如何向其中添加反射功能,这样我什至不需要确定类型,只需在主java中传递类名并创建该子类的对象

最佳答案

要实现此功能,您的 CatDog 类必须位于包 your.package 中各自的文件中,并且具有默认构造函数:

public class AnimalFactory {
    public Animal getAnimal(String type) {
        return (Animal) Class.forName("your.package." + type).newInstance();
    }
}

关于java - 通过反射(reflection)思考工厂设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417688/

相关文章:

design-patterns - DDD 只读存储库返回 "value objects"

java - 如何实现像Hibernate一样的惰性getObject方法?

java - 为什么我需要 FactorySupplier?

haskell - 对于简单的代码,类型约束变得巨大且不可读

java - code::blocks 不支持 JNI 宏?

Java::LinkedList 的插入速度真的比 ArrayList 快吗?

java - Android改造设计模式

Ruby:当类方法就足够时,为什么要实例化一个对象并使用实例方法?

java - wsimport 结果具有不同的运行时端点

java - ArrayDeque vs ArrayList 实现堆栈