我有一个工厂,可以制造多种类型的对象,它可能会增长。
使用反射来返回所有不同的类型而不是调用getPrototypes()
方法中的每个方法是一个好主意吗?
如果有了反射,它看起来就像这样:
public final class ShapeFactory
{
private ShapeFactory(){} // no instance
public static Shape buildSquare()
{
return new Square(2);
}
public static Shape buildCircle()
{
return new Circle(2);
}
public static Shape buildTriangle()
{
return new Triangle(2, 2, 2);
}
// and many more shapes...
public static List<Shape> getPrototypes()
{
final List<Shape> prototypes = new ArrayList<>();
// using reflection, call every build function
final Method[] methods = ShapeFactory.class.getMethods();
for(final Method picked : methods)
{
if(picked.getReturnType() == Shape.class && picked.getParameterTypes().length == 0)
{
try
{
prototypes.add((Shape)picked.invoke(null));
}
catch(final Exception e)
{
// this is an example, do not ignore
// exceptions in real code
}
}
}
return prototypes;
}
}
抱歉用了Shape的例子
编辑:形状是可克隆的原型。编辑#2:改进了示例,以防有人使用。
这是一件合理的事情。反射代码更加复杂和脆弱,但这意味着当您添加新的形状构建器方法时不需要更改使用反射来返回所有不同的类型而不是调用getPrototypes()方法中的每个方法,这是一个好主意吗?
getPrototypes()
。这要看哪个对你更重要。
然而,你不应该像现在这样压制异常。也许你应该更有选择性地选择你用来创建原型的方法。(当前版本将失败,如果你添加一个方法,返回一个Shape
,但接受参数…或者不是一个生成器)
这实际上取决于您是希望在编译时进行类型检查,还是希望以牺牲编译时检查为代价来获得运行时探索的灵活性。