Reemplazar constructor con método de fábrica.
Tienes un constructor complejo que hace algo más que limitarse a asignar los valores de los parámetros a los campos del objeto.
Crea un método de fábrica y úsalo para reemplazar las llamadas al constructor.
##Example
class Employee {
Employee(int type) {
this.type = type;
}
// ...
}class Employee {
static Employee create(int type) {
employee = new Employee(type);
// hace algo de trabajo pesado.
return employee;
}
// ...
}##Why Refactor
La razón más evidente para usar esta técnica de refactorización está relacionada con Reemplazar código de tipo con subclases.
Tienes código en el que antes se creaba un objeto y se le pasaba el valor del tipo codificado. Tras aplicar el método de refactorización, han aparecido varias subclases y, a partir de ellas, necesitas crear objetos según el valor del tipo codificado. Cambiar el constructor original para que devuelva objetos de subclase es imposible, así que en su lugar creamos un método de fábrica estático que devolverá objetos de las clases necesarias, tras lo cual reemplaza todas las llamadas al constructor original.
Los métodos de fábrica también pueden usarse en otras situaciones, cuando los constructores no están a la altura de la tarea. Pueden ser importantes al intentar Cambiar valor por referencia. También pueden usarse para establecer diversos modos de creación que van más allá del número y los tipos de parámetros.
##Benefits
-
Un método de fábrica no devuelve necesariamente un objeto de la clase en la que se invocó. A menudo podrían ser sus subclases, seleccionadas en función de los argumentos dados al método.
-
Un método de fábrica puede tener un nombre mejor que describa qué devuelve y cómo lo hace, por ejemplo
Troops::GetCrew(myTank). -
Un método de fábrica puede devolver un objeto ya creado, a diferencia de un constructor, que siempre crea una instancia nueva.
##How to Refactor
-
Crea un método de fábrica. Coloca en él una llamada al constructor actual.
-
Reemplaza todas las llamadas al constructor por llamadas al método de fábrica.
-
Declara el constructor como privado.
-
Examina el código del constructor e intenta aislar el código que no esté directamente relacionado con la construcción de un objeto de la clase actual, trasladando ese código al método de fábrica.