2

我有一个可以建造多种类型物体的工厂,它可能会增长。

使用反射返回所有不同类型而不是调用方法中的每个方法是个好主意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:改进示例以防有人使用它。

4

2 回答 2

0

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

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

于 2013-03-27T16:22:59.667 回答
0

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

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

但是,您不应该像您正在做的那样压制异常。也许您应该对用于创建原型的方法更具选择性。(如果您添加一个返回 aShape但接受参数的方法......或者不是构建器,则当前版本将失败。)

于 2013-03-27T16:25:04.410 回答