El patrón de fábrica simple centraliza la lógica de creación en una clase, la cual decide qué objeto concreto instanciar basándose en parámetros proporcionados por el cliente. Esta aproximaicón elimina la dependencia directa del cleinte con las implementaciones específicas, pero puede violar el principio abierto/cerrado, ya que requiere modificaciones en la clase fábrica para añadir nuevos tipos.
Ejemplo de Implementación en C#
public class CalculoBase
{
public double OperandoX { get; set; }
public double OperandoY { get; set; }
public virtual double Calcular()
{
return 0;
}
}
public class CalculoSuma : CalculoBase
{
public override double Calcular()
{
return OperandoX + OperandoY;
}
}
public class CalculoResta : CalculoBase
{
public override double Calcular()
{
return OperandoX - OperandoY;
}
}
public static class FabricaDeCalculos
{
public static CalculoBase CrearOperacion(string operador)
{
CalculoBase operacion = null;
if (operador == "+")
{
operacion = new CalculoSuma();
}
else if (operador == "-")
{
operacion = new CalculoResta();
}
return operacion;
}
}
// Uso del patrón
class Programa
{
static void Main()
{
CalculoBase miCalculo = FabricaDeCalculos.CrearOperacion("+");
miCalculo.OperandoX = 5;
miCalculo.OperandoY = 3;
Console.WriteLine(miCalculo.Calcular()); // Salida: 8
}
}
Ejemplo de Implementación en C++
#include <iostream>
#include <string>
using namespace std;
class Entidad
{
protected:
string genero;
public:
virtual void AsignarGenero() {}
virtual string ObtenerGenero() { return genero; }
};
class Varon : public Entidad
{
public:
void AsignarGenero() override
{
genero = "Varon";
}
string ObtenerGenero() override
{
return genero;
}
};
class Mujer : public Entidad
{
public:
void AsignarGenero() override
{
genero = "Mujer";
}
string ObtenerGenero() override
{
return genero;
}
};
class FabricaSimple
{
public:
static Entidad* Generar(char tipo)
{
if (tipo == 'V')
{
return new Varon();
}
else if (tipo == 'M')
{
return new Mujer();
}
return nullptr;
}
};
int main()
{
Entidad* individuo1 = FabricaSimple::Generar('V');
individuo1->AsignarGenero();
cout << individuo1->ObtenerGenero() << endl; // Salida: Varon
Entidad* individuo2 = FabricaSimple::Generar('M');
individuo2->AsignarGenero();
cout << individuo2->ObtenerGenero() << endl; // Salida: Mujer
delete individuo1;
delete individuo2;
return 0;
}