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