Enum фабричный метод

В моем приложении можно создать несколько разных отчетов (CSV, HTML и т. Д.).

Вместо создания традиционного шаблона метода в фабричном стиле я планировал добавить в тело констант перечисления метод, который будет создавать и возвращать соответствующий объект отчета.

public enum ReportType {
 CSV {
  @Override
  public Report create() {
   return new CSVReport();
  }
 },
 HTML {
  @Override
  public Report create() {
   return new HTMLReport();
  }
 };

 public abstract Report create();
}

С указанной константой перечисления ReportType я мог бы легко создать новый отчет, выполнив оператор, подобный следующему:

ReportType.CSV.create()

Я хотел узнать мнение других об использовании этого подхода. Что ты думаешь об этом? Вы бы предпочли какой-либо другой подход, и если да, то почему?

Спасибо


person Steve    schedule 29.01.2010    source источник


Ответы (4)


Я думаю, что оба подхода подходят, но если вы не хотите знать, какой отчет вы создаете, я считаю, что подход enum является лучшим. Вот так:

public class Person { 
    private String name;
    private ReportType myPreferedReportType;

    public ReportType getMyPreferedReportType(){
        return this.myPreferedReportType;
    }
    //other getters & setters...
}

предположим, что вы сохраняете экземпляр Person в базе данных и извлекаете его позже - если вы используете полиморфизм, вам вообще не понадобится никакой переключатель. Единственное, что вам нужно сделать, это вызвать метод create (). Нравится:

Person person = null; 
//... retrieve the person instance from database and generate a 
//report with his/her prefered report type...
Report report = person.getReportType.create();

Так что, если вы полагаетесь на полиморфизм, вам не нужно явно просить фабрику предоставить вам CVS / HTML / PDF, оставив эту работу самому Enum. Но, конечно, есть ситуации, в которых вам может понадобиться использовать ту или иную, хотя я обычно использую подход enum регулярно.

person Lucas de Oliveira    schedule 10.02.2010

Взгляните на Перечисление с шаблоном посетителя. При таком подходе вы сможете динамически добавлять функциональные возможности в перечисление, не загрязняя само перечисление.

person mtpettyp    schedule 10.02.2010

Джошуа Блох (признанный эксперт по Java) на самом деле рекомендует этот подход в своей книге «Эффективная Java 2-е издание» на стр. 17: Обеспечение использования свойства singleton с помощью частного конструктора или типа enum.

person Greg    schedule 29.01.2010
comment
Это в отношении синглтонов. - person Steve; 29.01.2010

person    schedule
comment
Действительный пункт. Enum в Java часто используются не только для констант, поскольку они являются классами. Думаю, я предпочитаю простоту, которая дает тип отчета, я могу затем создать его без каких-либо фабрик. Это не обязательно потребует дополнительного кода для фабрики. - person Steve; 29.01.2010
comment
Смысл использования перечислений и даже абстрактных фабрик - это точка, в которой вы решаете, детали реализации удаляются из точки запроса создания. (Так что, если вы никогда не собираетесь разделять эти точки, нет смысла в преждевременном косвенном обращении.) - person Tom Hawtin - tackline; 29.01.2010