2010-01-29 3 views
10

Nella mia applicazione, è possibile generare diversi report (CSV, HTML, ecc.).Metodo stile factory Enum

Invece di creare un modello di metodo tradizionale in stile fabbrica, stavo progettando di aggiungere un metodo al corpo di costanti enum che creava e restituiva l'oggetto report appropriato.

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

public abstract Report create(); 
} 

Con una costante ReportType enum specificato, ho potuto quindi creare facilmente un nuovo rapporto eseguendo una dichiarazione come la seguente:

ReportType.CSV.create() 

volevo ottenere il parere degli altri sull'utilizzo di questo approccio. Cosa ne pensi di questo? Preferiresti un altro approccio e, in tal caso, perché?

Grazie

risposta

4

Penso che entrambi gli approcci siano ok, ma se non vuoi sapere che tipo di rapporto stai generando, allora credo che l'approccio enum sia il migliore. In questo modo:

supose persistono un'istanza di persona in un database e recuperare in un secondo momento - se si utilizza polimorfismo non sarà necessario alcun wathsoever interruttore. L'unica cosa che devi fare è chiamare il metodo create(). Come:

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

Quindi, se ci si basa su polimorfismo non avrete bisogno di chiedere una fabbrica per ottenere il CVS/HTML/PDF in modo esplicito, lasciando che il lavoro alla Enum stesso. Ma naturalmente, ci sono situazioni in cui potresti doverne usare l'una o l'altra, sebbene io tendo ad usare regolarmente l'approccio enum.

1

Joshua Bloch (esperto Java riconosciuta) in realtà raccomanda questo approccio nel suo libro Effective Java 2nd Edition a pagina 17: far rispettare la proprietà Singleton con un costruttore privato o un tipo enum.

+0

Questo è per quanto riguarda Singletons. – Steve

3

Qual è il vantaggio che si ottiene utilizzando enum, ad esempio per la creazione di report? Se avessi un metodo di produzione, avresti creato un'istanza di CSVReport (diciamo) come di seguito:

Report csvReport = ReportFactory.createCSVReport(); 

che penso trasmetta meglio l'intento dell'enum. Come ho capito Le enumerazioni rappresentano un insieme fisso di costanti e utilizzarlo come una fabbrica per la creazione di istanze (anche se funziona) mi sembra un abuso dell'intento di Enumeration.

+0

Punto valido. Gli Enum in Java sono spesso usati in modi che non contengono solo costanti come sono classi. Credo di preferire la semplicità che ha dato un tipo di rapporto, posso quindi scegliere di crearlo senza fabbriche. Questo non richiederebbe necessariamente un codice aggiuntivo per la fabbrica. – Steve

+3

Il punto di utilizzo dell'enumerazione, e in effetti delle fabbriche astratte, è il punto in cui si decide di rimuovere i dettagli dell'implementazione dal punto di richiesta della creazione. (Quindi, se non riuscirai mai a separare questi punti, non c'è motivo di indecrezione precoce.) –

2

Vedere Enum with Visitor Pattern. Con questo approccio sarete in grado di aggiungere dinamicamente funzionalità a un enum senza dover inquinare l'enum stesso.