Saltar al contenido principal

Factory Method

CreationalExtensibilityGang of FourAlrededor de 2 min

También conocido como

Virtual Constructor

Propósito

Definir una interfaz para crear un objeto, pero dejar que las subclases decidan qué clase instanciar. El método de
fábrica permite que una clase difiera la instanciación a las subclases.

Explicación

Ejemplo del mundo real

El herrero fabrica armas. Los elfos requieren armas élficas y los orcos requieren armas orcas. Dependiendo del cliente
en cuestión, se convoca al tipo correcto de herrero.

En palabras sencillas

Proporciona una forma de delegar la lógica de instanciación a las clases hijas.

Wikipedia dice

En la programación basada en clases, el patrón de método de fábrica es un patrón de creación que utiliza métodos de
fábrica para lidiar con el problema de crear objetos sin tener que especificar la clase exacta del objeto que se
creará.
Esto se hace creando objetos llamando a un método de fábrica — ya sea especificado en una interfaz e implementado por
clases hijas, o implementado en una clase base y opcionalmente sobrescrito por clases derivadas — en lugar de llamar a
un constructor.

Ejemplo programático

Tomando nuestro ejemplo del herrero. En primer lugar, tenemos una interfaz Blacksmith y algunas implementaciones para
ello:

public interface Blacksmith {
  Weapon manufactureWeapon(WeaponType weaponType);
}

public class ElfBlacksmith implements Blacksmith {
  public Weapon manufactureWeapon(WeaponType weaponType) {
    return ELFARSENAL.get(weaponType);
  }
}

public class OrcBlacksmith implements Blacksmith {
  public Weapon manufactureWeapon(WeaponType weaponType) {
    return ORCARSENAL.get(weaponType);
  }
}

Cuando llegan los clientes, se llama al herrero adecuado y se fabrican las armas solicitadas:

Blacksmith blacksmith = new OrcBlacksmith();
Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
LOGGER.info("{} manufactured {}", blacksmith, weapon);
weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
LOGGER.info("{} manufactured {}", blacksmith, weapon);

blacksmith = new ElfBlacksmith();
weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
LOGGER.info("{} manufactured {}", blacksmith, weapon);
weapon = blacksmith.manufactureWeapon(WeaponType.AXE);
LOGGER.info("{} manufactured {}", blacksmith, weapon);

Salida del programa:

The orc blacksmith manufactured an orcish spear
The orc blacksmith manufactured an orcish axe
The elf blacksmith manufactured an elven spear
The elf blacksmith manufactured an elven axe

Diagrama de clases

alt text
Factory Method pattern diagrama de clases

Aplicabilidad

Utilice el patrón Método de Fábrica cuando:

  • La clase no puede anticipar la clase de objetos que debe crear.
  • La clase quiere que sus subclases especifiquen los objetos que crea.
  • Las clases delegan la responsabilidad a una de varias subclases ayudantes, y desea localizar el conocimiento de qué
    subclase ayudante es el delegado. conocimiento de qué subclase ayudante es el delegado.

Usos conocidos

Créditos