2013-03-27 2 views
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: Улучшен пример, если кто-то его использует.

+0

Да, это хорошая практика: http://www.codeproject.com/Articles/ 37547/Exploring-Factory-Pattern В C# – zzfima

+0

Если вы можете позволить себе цену исполнения рефлексии, то да нет причины не упрощать жизнь. Но убедитесь, что стоимость приемлема. – Thihara

ответ

0

Было бы неплохо использовать отражение для возврата всех разных типов вместо вызова каждого метода в методе getPrototypes()?

Это разумная вещь. Отражающий код более сложный и хрупкий, но это означает, что при добавлении нового метода построения фигуры вам не нужно менять getPrototypes(). Это зависит от того, что для вас важнее.

Однако вы НЕ должны раздавить исключения, как вы делаете. И, может быть, вы должны быть более избирательными из методов, которые вы используете для создания прототипов. (Текущая версия будет FAIL, если вы добавите метод, который возвращает Shape, но принимает аргументы ... или не является строителем.)

+0

Да, это было только для примера. – phil

+0

Я приведу предупреждение в примере об игнорировании исключений. – phil

0

Это действительно зависит от того, хотите ли вы, чтобы проверка типа выполнялась во время компиляции, или вы хотите гибкость проведения разведки во время проверки времени компиляции.

Оба варианта являются вполне обоснованными подходами.

+0

В этом случае я думаю, что отражение делает его более чистым и более гибким. Благодаря! – phil

Смежные вопросы