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

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

11 голосов
/ 29 января 2010

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

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

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()

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

Спасибо

Ответы [ 4 ]

5 голосов
/ 10 февраля 2010

Я думаю, что оба подхода хороши, но если вы не хотите знать, какой тип отчета вы генерируете, то я считаю, что подход 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 регулярно.

3 голосов
/ 29 января 2010

Какое преимущество вы получаете, используя enum для создания отчетов? Если бы у вас был factory-method, вы бы создали экземпляр CSVReport (скажем), как показано ниже: </p> <pre><code>Report csvReport = ReportFactory.createCSVReport();

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

2 голосов
/ 10 февраля 2010

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

1 голос
/ 29 января 2010

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

...