Kullanım Factory method kalıbı:
public enum ReportType {EXCEL, CSV};
@Service
public class ReportFactory {
@Resource
private ExcelReport excelReport;
@Resource
private CSVReport csvReport
public Report forType(ReportType type) {
switch(type) {
case EXCEL: return excelReport;
case CSV: return csvReport;
default:
throw new IllegalArgumentException(type);
}
}
}
Eğer ?type=CSV
ile kontrolör çağırdığınızda tip enum
Bahar oluşturulabilir raporu:
class MyController{
@Resource
private ReportFactory reportFactory;
public HttpResponse getReport(@RequestParam("type") ReportType type){
reportFactory.forType(type);
}
}
Ancak ReportFactory
oldukça hantal ve değişiklik yapılmasını gerektirir her yeni rapor türünü eklediğinizde. Eğer rapor türleri listelenirse düzeltilmiş demektir.
public interface Report {
void generateFile();
boolean supports(ReportType type);
}
public class ExcelReport extends Report {
publiv boolean support(ReportType type) {
return type == ReportType.EXCEL;
}
//...
}
@Service
public class ReportFactory {
@Resource
private List<Report> reports;
public Report forType(ReportType type) {
for(Report report: reports) {
if(report.supports(type)) {
return report;
}
}
throw new IllegalArgumentException("Unsupported type: " + type);
}
}
yeni rapor türünü ekleyerek Bu uygulamayla Report
ve yeni bir ReportType
enum değeri uygulayan yeni fasulye eklemek kadar basit olduğunu: Daha fazla ve daha fazla türde eklemeyi planlıyoruz Ama eğer, bu daha sağlam bir uygulamasıdır. enum
olmadan ve dizeleri (belki de fasulye isimleri) kullanmadan uzaklaşabilirdiniz, ancak güçlü yazmayı faydalı buldum.
Son düşünce: Report
adı biraz talihsiz bir durumdur. Report
sınıfı, (mantıksız?) Bazı mantığın (Strategy modeli) kapsüllemesini temsil ederken, adın değerini (veri) kapsandığını öne sürer. ReportGenerator
ya da benzerlerini öneriyorum.
Çok teşekkürler Tomasz ... bunu deneyecek. İsmini buna göre değiştireceğim. –
Bir çekicilik gibi çalıştım ... Ölçeklendirilebilir seçeneği göstermek için –
+1 çok teşekkür ederiz – DecafCoder