Factory Method
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
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
- java.util.Calendar
- java.util.ResourceBundle
- java.text.NumberFormat
- java.nio.charset.Charset
- java.net.URLStreamHandlerFactory
- java.util.EnumSet
- javax.xml.bind.JAXBContext