如何构建通用工厂



目前我正在尝试构建一个能够创建随机对象的Java类。 我用工厂模式尝试过,抽象的产品界面是这样的:

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

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

public class GenericFactory implements ObjectFactory<T> {
@Override
public T createObject()
{
return new T();
} 
}

IntelliJ 说:"无法解析符号 T">

Java对泛型使用类型擦除。因此,JVM无法知道T在运行时实际上是哪种类型。

你可以使用 refelection 创建一个通用工厂,但这真的很丑陋。如果你想在生产中使用通用工厂,那就去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;
}
}
}

这不是泛型类的有效实现。

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

代码应该看起来更像这样:

public class GenericFactory implements ObjectFactory<MyClass> {
@Override
public MyClass createObject() {
return new MyClass();
}
}

最新更新