2010-01-29 13 views
10

En mi aplicación, se pueden generar varios informes diferentes (CSV, HTML, etc.).Enum método de fábrica

En lugar de crear un patrón de método de estilo de fábrica tradicional, estaba planeando agregar un método al cuerpo de constantes enum que crearía y devolvería el objeto de informe apropiado.

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 constante ReportType enumeración especificada, podría entonces crear fácilmente un nuevo informe de la ejecución de una declaración como la siguiente:

ReportType.CSV.create() 

quería obtener la opinión de los demás sobre el uso de este enfoque. ¿Qué piensas de esto? ¿Preferirías otro enfoque? Si es así, ¿por qué?

Gracias

Respuesta

4

Creo que ambos enfoques están bien, pero si no quiere saber qué tipo de informe está generando, entonces creo que el enfoque enum es el mejor. De este modo:

supose persiste una instancia de Persona en una base de datos y recuperarlo más adelante - si utiliza polimorfismo que no tendrá ningún wathsoever interruptor. Lo único que tendrá que hacer es para llamar al método create(). Al igual que:

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

Por lo tanto si se basan en polimorfismo que no se necesita pedir una fábrica para obtener el CVS/HTML/PDF de forma explícita, dejando que el trabajo de la propia enumeración. Pero, por supuesto, hay situaciones que puede necesitar usar de una u otra, aunque tiendo a usar el enfoque enum regularmente.

1

Joshua Bloch (experto reconocido Java) en realidad recomienda este enfoque en su libro A partir de Java segunda edición en la página 17: Hacer cumplir la propiedad singleton con un constructor privado o un tipo de enumeración.

+0

Eso es en lo que respecta a Singletons. – Steve

3

¿Cuál es la ventaja que obtiene al usar enum, por ejemplo, la creación de informes? Si tuviera el método de fábrica, habría creado una instancia de CSVReport (por ejemplo) como la siguiente:

Report csvReport = ReportFactory.createCSVReport(); 

que creo que transmite la intención mejor que la enumeración. Como yo entiendo, las enumeraciones representan un conjunto fijo de constantes, y usarlo como una fábrica, por ejemplo, creación (aunque funciona), me parece un mal uso de la intención de la enumeración.

+0

Punto válido. Enum's en Java a menudo se usan de formas distintas a las constantes, ya que son clases. Supongo que prefiero la simplicidad que, dado un tipo de informe, puedo elegir crearlo sin ninguna fábrica. Esto no requeriría necesariamente código adicional para la fábrica. – Steve

+3

El punto de utilizar enumeraciones, y de hecho de fábricas abstractas, es el punto en el que usted decide sobre los detalles de implementación que se elimina del punto de solicitud de creación. (Entonces, si nunca va a desacoplar esos puntos, no tiene sentido la indirección prematura). –

2

Mire el Enum with Visitor Pattern. Con ese enfoque, podrá agregar funcionalidad de forma dinámica a una enumeración sin tener que contaminar la enumeración en sí.

Cuestiones relacionadas