如何建立通用工厂

时间:2018-09-13 13:15:11

标签: java generics factory

此刻,我正在尝试构建一个能够创建随机对象的Java类。 我用Factory Pattern尝试过,抽象的Product Interface就像:

public interface ObjectFactory<T>
{
    T createObject();
}

但是当我尝试实现具体的通用产品时,它不起作用。 这是我具体产品的代码:

public class GenericFactory implements ObjectFactory<T> {

    @Override
    public T createObject()
    {
        return new T();
    } 
}

IntelliJ说:“无法解析符号T”

2 个答案:

答案 0 :(得分:0)

这不是通用类的有效实现。

Concrete类需要指定类型变量T是哪个对象。

代码应更像这样:

public class GenericFactory implements ObjectFactory<MyClass> {

    @Override
    public MyClass createObject() {
        return new MyClass();
    }

}

答案 1 :(得分:0)

Java使用type erasure作为泛型。因此,JVM无法在运行时知道T实际上是哪种类型。

您可以使用反射来创建通用工厂,但这确实很丑陋。如果要在生产中使用通用工厂,请使用Spring或类似的工具。

public interface ObjectFactory<T> {

    T createObject(Class<? extends T> type);

}

public class GenericFactory<T> implements ObjectFactory<T> {

    public T createObject(Class<? extends T> type) {
        try {
            Constructor<? extends T> constructor = type.getDeclaredConstructor();

            constructor.setAccessible(true);

            return constructor.newInstance();
        } catch (Throwable e) {
            throw new InstantiationError("Can not create an object of class " + type.getName());
        }
    }

}

public class Main {

    public static void main(String[] args) {
        GenericFactory<Car> carFactory = new GenericFactory<>();
        Car car = carFactory.createObject(Car.class); // works

        GenericFactory<Car> bikeFactory = new GenericFactory<>();
        Bike bike = bikeFactory.createObject(Bike.class); // throws exception
    }

    private static class Car {}

    private static class Bike {

        private String color;

        Bike(String color) {
            this.color = color;
        }

    }

}