El patrón de método de fábrica define una interfaz para crear objetos, permitiendo que las subclases decidan qué clase instanciar. Esto promueve la extensibilidad al adherirse al principio abierto/cerado, donde el código existente no necesita modificarse para incorporar nuevos tipos de productos.
En comparación con el patrón de fábrica simple, este enfoque introduce una capa de abstracción adicional mediante clases abstractas o interfaces para las fábricas y productos. Las fábricas concretas se encargan de la creación de productos específicos, lo que facilita la gestión de jerarquías complejas y la implementación en entornos como Unity.
Patrones relacionados incluyen el patrón de fábrica abstracta, que a menudo utiliza métodos de fábrica para construir componentes, y el patrón de método plantilla, donde los métodos de fábrica se emplean para generar objetos necesarios en su ejecución.
A continuación, se presenta un ejemplo de implementación en Unity C#, donde se modela la creación de vehículos con dfierentes características. La estructura consta de una fábrica abstracta, fábricas concretas, un producto abstracto y productos concretos.
public abstract class FabricaVehiculo
{
public abstract Vehiculo Crear();
}
public class FabricaCocheRapido : FabricaVehiculo
{
public override Vehiculo Crear()
{
return new CocheRapido();
}
}
public class FabricaCocheEconomico : FabricaVehiculo
{
public override Vehiculo Crear()
{
return new CocheEconomico();
}
}
public abstract class Vehiculo
{
public abstract void Encender();
public abstract void Mover();
public abstract void Apagar();
}
using UnityEngine;
public class CocheRapido : Vehiculo
{
public override void Encender()
{
Debug.Log("El coche rápido ha arrancado.");
}
public override void Mover()
{
Debug.Log("El coche rápido está en movimiento.");
}
public override void Apagar()
{
Debug.Log("El coche rápido se ha detenido.");
}
}
using UnityEngine;
public class CocheEconomico : Vehiculo
{
public override void Encender()
{
Debug.Log("El coche económico ha arrancado.");
}
public override void Mover()
{
Debug.Log("El coche económico está en movimiento.");
}
public override void Apagar()
{
Debug.Log("El coche económico se ha detenido.");
}
}
using UnityEngine;
public class ControladorVehiculo : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
FabricaVehiculo fabrica = new FabricaCocheRapido();
Vehiculo vehiculo = fabrica.Crear();
vehiculo.Encender();
vehiculo.Mover();
vehiculo.Apagar();
}
if (Input.GetKeyDown(KeyCode.E))
{
FabricaVehiculo fabrica = new FabricaCocheEconomico();
Vehiculo vehiculo = fabrica.Crear();
vehiculo.Encender();
vehiculo.Mover();
vehiculo.Apagar();
}
}
}