ConstructiCat Logo
CodeBust.
Browse section ▾

Substituir Construtor por Método de Fábrica.

Problem

Você tem um construtor complexo que faz algo mais do que apenas atribuir valores de parâmetros a campos do objeto.

Solution

Crie um método de fábrica e use-o para substituir as chamadas ao construtor.

##Example

Before
class Employee {
  Employee(int type) {
    this.type = type;
  }
  // ...
}
After
class Employee {
  static Employee create(int type) {
    employee = new Employee(type);
    // faz um trabalho pesado.
    return employee;
  }
  // ...
}

##Why Refactor

A razão mais óbvia para usar esta técnica de refatoração está relacionada a Substituir Código de Tipo por Subclasses.

Você tem um código no qual um objeto era criado anteriormente e o valor do tipo codificado era passado a ele. Após o uso do método de refatoração, surgiram várias subclasses e, a partir delas, você precisa criar objetos dependendo do valor do tipo codificado. Alterar o construtor original para fazê-lo retornar objetos de subclasse é impossível, então, em vez disso, criamos um método de fábrica estático que retornará objetos das classes necessárias, depois do que ele substitui todas as chamadas ao construtor original.

Métodos de fábrica também podem ser usados em outras situações, quando os construtores não dão conta da tarefa. Eles podem ser importantes ao tentar Mudar Valor para Referência. Também podem ser usados para definir vários modos de criação que vão além do número e dos tipos de parâmetros.

##Benefits

  • Um método de fábrica não necessariamente retorna um objeto da classe na qual foi chamado. Muitas vezes podem ser suas subclasses, selecionadas com base nos argumentos passados ao método.

  • Um método de fábrica pode ter um nome melhor que descreva o que ele retorna e como, por exemplo Troops::GetCrew(myTank).

  • Um método de fábrica pode retornar um objeto já criado, ao contrário de um construtor, que sempre cria uma nova instância.

##How to Refactor

  1. Crie um método de fábrica. Coloque nele uma chamada ao construtor atual.

  2. Substitua todas as chamadas ao construtor por chamadas ao método de fábrica.

  3. Declare o construtor como privado.

  4. Investigue o código do construtor e tente isolar o código que não está diretamente relacionado à construção de um objeto da classe atual, movendo esse código para o método de fábrica.