我有一个可以构建多种类型对象的工厂,它可能会成长。
使用反射来返回所有不同类型而不是调用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:改进了示例,以防有人使用它。
答案 0 :(得分:0)
这实际上取决于您是否希望在编译时完成类型检查,或者您希望以编译时间检查为代价来灵活地进行运行时探索。
这两种选择都是完全有效的方法。
答案 1 :(得分:0)
使用反射来返回所有不同类型而不是调用getPrototypes()方法中的每个方法是不是一个好主意?
这是合理的事情。反射代码更复杂,更脆弱,但这意味着在添加新的形状构建器方法时无需更改getPrototypes()
。这取决于哪个对你更重要。
但是,你不应该像你一样压缩异常。也许你应该更加选择用于创建原型的方法。 (如果添加一个返回Shape
但接受参数的方法,或者不是构建器,则当前版本将失败。)