- Combo 1: Interfaz y Extensión Abstract Factory + Bridge Uso: Separar la abstracción de la implementación y permitir configuraciones independientes de ambas.
using System;
namespace RemoteControlApp { // Abstract Factory: Interfaz para crear familias de productos relacionados public interface IFabricaDispositivos { IControlRemoto CrearControlRemoto(); IDevice CrearDispositivo(); }
// Concrete Factory 1: Crea productos que están relacionados por una variante específica
public class FabricaTv : IFabricaDispositivos
{
public IControlRemoto CrearControlRemoto()
{
return new ControlRemotoBasico();
}
public IDevice CrearDispositivo()
{
return new Televisor();
}
}
// Concrete Factory 2: Crea productos que están relacionados por una variante específica
public class FabricaRadio : IFabricaDispositivos
{
public IControlRemoto CrearControlRemoto()
{
return new ControlRemotoAvanzado();
}
public IDevice CrearDispositivo()
{
return new Radio();
}
}
// Abstract Product A: Interfaz para los objetos de producto
public interface IControlRemoto
{
void EncenderApagar();
void BajarVolumen();
void SubirVolumen();
void MostrarEstado();
}
// Abstract Product B: Interfaz para los objetos de producto
public interface IDevice
{
bool EstaEncendido();
void Encender();
void Apagar();
int ObtenerVolumen();
void AjustarVolumen(int volumen);
}
// Concrete Product A1: Implementa la interfaz de producto A
public class ControlRemotoBasico : IControlRemoto
{
protected IDevice _dispositivo;
public ControlRemotoBasico()
{
_dispositivo = null;
}
public ControlRemotoBasico(IDevice dispositivo)
{
_dispositivo = dispositivo;
}
public virtual void EncenderApagar() // Marcar como virtual
{
if (_dispositivo != null)
{
if (_dispositivo.EstaEncendido())
_dispositivo.Apagar();
else
_dispositivo.Encender();
Console.WriteLine($"Energía {(_dispositivo.EstaEncendido() ? "ENCENDIDA" : "APAGADA")}");
}
}
public void BajarVolumen()
{
if (_dispositivo != null)
{
int volumen = _dispositivo.ObtenerVolumen() - 10;
_dispositivo.AjustarVolumen(volumen);
Console.WriteLine($"Volumen: {volumen}");
}
}
public void SubirVolumen()
{
if (_dispositivo != null)
{
int volumen = _dispositivo.ObtenerVolumen() + 10;
_dispositivo.AjustarVolumen(volumen);
Console.WriteLine($"Volumen: {volumen}");
}
}
public void MostrarEstado()
{
if (_dispositivo != null)
{
Console.WriteLine($"Estado del dispositivo: Energía {(_dispositivo.EstaEncendido() ? "ENCENDIDA" : "APAGADA")}, Volumen: {_dispositivo.ObtenerVolumen()}");
}
}
}
// Concrete Product A2: Implementa la interfaz de producto A
public class ControlRemotoAvanzado : ControlRemotoBasico
{
public override void EncenderApagar()
{
if (_dispositivo != null)
{
base.EncenderApagar();
Console.WriteLine("Función avanzada: Algo más...");
}
}
public void Silenciar()
{
if (_dispositivo != null)
{
_dispositivo.AjustarVolumen(0);
Console.WriteLine("Silenciado");
}
}
}
// Concrete Product B1: Implementa la interfaz de producto B
public class Televisor : IDevice
{
private bool _estaEncendido;
private int _volumen;
public Televisor()
{
_estaEncendido = false;
_volumen = 50;
}
public bool EstaEncendido() => _estaEncendido;
public void Encender() => _estaEncendido = true;
public void Apagar() => _estaEncendido = false;
public int ObtenerVolumen() => _volumen;
public void AjustarVolumen(int volumen) => _volumen = volumen;
}
// Concrete Product B2: Implementa la interfaz de producto B
public class Radio : IDevice
{
private bool _estaEncendido;
private int _volumen;
public Radio()
{
_estaEncendido = false;
_volumen = 50;
}
public bool EstaEncendido() => _estaEncendido;
public void Encender() => _estaEncendido = true;
public void Apagar() => _estaEncendido = false;
public int ObtenerVolumen() => _volumen;
public void AjustarVolumen(int volumen) => _volumen = volumen;
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bienvenido al control remoto");
Console.WriteLine("Seleccione el dispositivo:");
Console.WriteLine("1. Televisor");
Console.WriteLine("2. Radio");
int seleccion;
while (!int.TryParse(Console.ReadLine(), out seleccion) || (seleccion != 1 && seleccion != 2))
{
Console.WriteLine("Selección inválida. Por favor, introduzca 1 para Televisor o 2 para Radio.");
}
IFabricaDispositivos fabricaDispositivos = null;
if (seleccion == 1)
{
fabricaDispositivos = new FabricaTv();
}
else if (seleccion == 2)
{
fabricaDispositivos = new FabricaRadio();
}
if (fabricaDispositivos != null)
{
IControlRemoto controlRemoto = fabricaDispositivos.CrearControlRemoto();
IDevice dispositivo = fabricaDispositivos.CrearDispositivo();
while (true)
{
Console.WriteLine("\nMenú:");
Console.WriteLine("1. Encender/Apagar");
Console.WriteLine("2. Subir Volumen");
Console.WriteLine("3. Bajar Volumen");
Console.WriteLine("4. Mostrar Estado");
Console.WriteLine("0. Salir");
int opcion;
while (!int.TryParse(Console.ReadLine(), out opcion) || (opcion < 0 || opcion > 4))
{
Console.WriteLine("Entrada inválida. Por favor, ingrese una opción válida.");
}
if (opcion == 0)
break;
switch (opcion)
{
case 1:
controlRemoto.EncenderApagar();
break;
case 2:
controlRemoto.SubirVolumen();
break;
case 3:
controlRemoto.BajarVolumen();
break;
case 4:
controlRemoto.MostrarEstado();
break;
default:
break;
}
}
}
else
{
Console.WriteLine("Opción no válida. Saliendo del programa.");
}
}
}
}
https://www.loom.com/share/e6d00511b71f43e48c60220c62cba635?sid=4eb4ac92-12d6-43d4-87b4-ca038d01d464