---
title: "Reemplazar constructor con método de fábrica"
type: "refactoring-technique"
slug: "replace-constructor-with-factory-method"
url: "http://localhost:3000/es/replace-constructor-with-factory-method.md"
category: "Simplifying Method Calls"
description: "Problema: tienes un constructor complejo que hace algo más que limitarse a asignar los valores de los parámetros a los campos del objeto. Solución: crea un método de fábrica y úsalo para reemplazar las llamadas al constructor."
languages: ["java", "csharp", "php", "typescript"]
---
# Reemplazar constructor con método de fábrica

> Problema: tienes un constructor complejo que hace algo más que limitarse a asignar los valores de los parámetros a los campos del objeto. Solución: crea un método de fábrica y úsalo para reemplazar las llamadas al constructor.

## Problem

Tienes un constructor complejo que hace algo más que limitarse a asignar los valores de los parámetros a los campos del objeto.

## Solution

Crea un método de fábrica y úsalo para reemplazar las llamadas al constructor.

## 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](/es/replace-type-code-with-subclasses).

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](/es/change-value-to-reference). 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

1. Crea un método de fábrica. Coloca en él una llamada al constructor actual.
2. Reemplaza todas las llamadas al constructor por llamadas al método de fábrica.
3. Declara el constructor como privado.
4. 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.
## Relations

**Helps you do**

- [Cambiar Valor por Referencia](/es/change-value-to-reference.md)
- [Reemplazar código de tipo con subclases](/es/replace-type-code-with-subclasses.md)

## Code Examples

### java

```java
// Before
class Employee {
  Employee(int type) {
    this.type = type;
  }
  // ...
}

// After
class Employee {
  static Employee create(int type) {
    employee = new Employee(type);
    // hace algo de trabajo pesado.
    return employee;
  }
  // ...
}
```

### csharp

```csharp
// Before
public class Employee 
{
  public Employee(int type) 
  {
    this.type = type;
  }
  // ...
}

// After
public class Employee
{
  public static Employee Create(int type)
  {
    employee = new Employee(type);
    // Hace algo de trabajo pesado.
    return employee;
  }
  // ...
}
```

### php

```php
// Before
class Employee {
  // ...
  public function __construct($type) {
   $this->type = $type;
  }
  // ...
}

// After
class Employee {
  // ...
  static public function create($type) {
    $employee = new Employee($type);
    // hace algo de trabajo pesado.
    return $employee;
  }
  // ...
}
```

### typescript

```typescript
// Before
class Employee {
  constructor(type: number) {
    this.type = type;
  }
  // ...
}

// After
class Employee {
  static create(type: number): Employee {
    let employee = new Employee(type);
    // Hace algo de trabajo pesado.
    return employee;
  }
  // ...
}
```

