java - orden - Creación de objetos: constructores o métodos de fábrica estáticos
objetos en java (3)
Si conoce el tipo concreto de la clase que intenta crear, entonces llamar al Constructor está bien.
Los métodos de Static Factory son agradables cuando no está completamente seguro de cómo construir el objeto que necesita.
El Método de Fábrica todavía llama al Constructor en el tipo concreto, pero el método maneja la decisión sobre qué tipo de clase concreta crear. El método de fábrica devuelve un tipo de interfaz (en lugar de un tipo concreto) para que el tipo de concreto se oculte a la persona que llama.
Estoy pasando por Java efectivo y algunas de mis cosas que considero estándar no son sugeridas por el libro, por ejemplo creación de objetos, tenía la impresión de que los constructores son la mejor manera de hacerlo y los libros dicen que deberíamos usar de los métodos de fábrica estáticos, no soy capaz de algunas ventajas y desventajas así que estoy haciendo esta pregunta, aquí están los beneficios de usarlo.
Ventajas:
- Una ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, tienen nombres.
- Una segunda ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, no están obligados a crear un nuevo objeto cada vez que se invocan.
- Una tercera ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, pueden devolver un objeto de cualquier subtipo de su tipo de devolución.
- Una cuarta ventaja de los métodos de fábrica estáticos es que reducen la verbosidad de crear instancias de tipo parametrizadas.
Desventajas:
- La principal desventaja de proporcionar solo métodos de fábrica estáticos es que las clases sin constructores públicos o protegidos no se pueden subclasificar.
- Una segunda desventaja de los métodos de fábrica estáticos es que no se pueden distinguir fácilmente de otros métodos estáticos.
Referencia: Java efectivo, Joshua Bloch, edición 2, páginas: 5-10
No puedo entender la cuarta ventaja y la segunda desventaja y agradecería si alguien puede explicar esos puntos. También me gustaría saber cómo decidir si utilizar Constructor o Método estático de fábrica para la creación de objetos.
Desventaja 2.
Un método estático que se usa para la creación de objetos tiene el mismo diseño y apariencia funcional que cualquier otra función estática.
Con solo mirar un método estático que crea objetos, no sabría que lo hace, y lo opuesto es la parte relevante. Cuando está escribiendo código con el que no está familiarizado, puede ser difícil identificar el método estático correcto que se usa para crear objetos.
El uso del patrón de fábrica estático está bien documentado y puede ser muy útil, especialmente en situaciones de Singleton y Multiton . También es útil en la inicialización de objetos complejos.
Ventaja 4: cuando usas un constructor, tienes
Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>();
vs
Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat
esta ventaja desaparecerá en Java 7, cuando se introduzca la sintaxis del diamante
Desventaja 2. No se puede decir fácilmente si se usa un método
static
dado para el constructor o para otra cosa.
En cuanto a cómo elegir, no hay una receta única para eso. Puede sopesar todas las ventajas y desventajas mencionadas en un caso de uso, pero en la mayoría de los casos solo será una decisión impulsada por la experiencia.