在工厂中使用反射

时间:2013-03-27 16:16:19

标签: java oop design-patterns reflection coding-style

我有一个可以构建多种类型对象的工厂,它可能会成长。

使用反射来返回所有不同类型而不是调用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:改进了示例,以防有人使用它。

2 个答案:

答案 0 :(得分:0)

这实际上取决于您是否希望在编译时完成类型检查,或者您希望以编译时间检查为代价来灵活地进行运行时探索。

这两种选择都是完全有效的方法。

答案 1 :(得分:0)

  

使用反射来返回所有不同类型而不是调用getPrototypes()方法中的每个方法是不是一个好主意?

这是合理的事情。反射代码更复杂,更脆弱,但这意味着在添加新的形状构建器方法时无需更改getPrototypes()。这取决于哪个对你更重要。

但是,你不应该像你一样压缩异常。也许你应该更加选择用于创建原型的方法。 (如果添加一个返回Shape但接受参数的方法,或者不是构建器,则当前版本将失败。)