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()リフレクティブ コードはより複雑で脆弱ですが、新しいシェイプ ビルダー メソッドを追加するときに変更する必要がないことを意味します。それはあなたにとってどちらがより重要かによります。

ただし、あなたがやっているように例外をつぶすべきではありません。また、プロトタイプの作成に使用する方法をより選択する必要があるかもしれません。(現在のバージョンは、を返すShapeが引数を取るメソッドを追加した場合、またはビルダーではない場合、失敗します。)

于 2013-03-27T16:25:04.410 に答える