using System.Collections.Generic;
public class ConfiguracionProducto
private static ConfiguracionProducto _instance;
private Dictionary<string, string> configuracion;
private ConfiguracionProducto()
configuracion = new Dictionary<string, string>();
public static ConfiguracionProducto ObtenerInstancia()
_instance = new ConfiguracionProducto();
public void EstablecerConfiguracion(string clave, string valor)
configuracion[clave] = valor;
public Dictionary<string, string> ObtenerConfiguracion()
public interface IProducto
string ObtenerDescripcion();
public class ProductoBase : IProducto
private string descripcion;
public ProductoBase(string descripcion, double precio)
this.descripcion = descripcion;
public string ObtenerDescripcion()
public double ObtenerPrecio()
public abstract class Decorador : IProducto
protected IProducto producto;
public Decorador(IProducto producto)
this.producto = producto;
public virtual string ObtenerDescripcion()
return producto.ObtenerDescripcion();
public virtual double ObtenerPrecio()
return producto.ObtenerPrecio();
public class ColorDecorador : Decorador
public ColorDecorador(IProducto producto, string color) : base(producto)
public override string ObtenerDescripcion()
return base.ObtenerDescripcion() + $", Color: {color}";
public override double ObtenerPrecio()
return base.ObtenerPrecio() + 5;
public class AccesoriosDecorador : Decorador
private List<string> accesorios;
public AccesoriosDecorador(IProducto producto, List<string> accesorios) : base(producto)
this.accesorios = accesorios;
public override string ObtenerDescripcion()
return base.ObtenerDescripcion() + $", Accesorios: {string.Join(", ", accesorios)}";
public override double ObtenerPrecio()
return base.ObtenerPrecio() + (accesorios.Count * 10);
static void Main(string[] args)
ConfiguracionProducto configuracion1 = ConfiguracionProducto.ObtenerInstancia();
ConfiguracionProducto configuracion2 = ConfiguracionProducto.ObtenerInstancia();
Console.WriteLine(configuracion1 == configuracion2);
IProducto productoBase = new ProductoBase("Teléfono", 200);
Console.WriteLine(productoBase.ObtenerDescripcion());
Console.WriteLine(productoBase.ObtenerPrecio());
IProducto productoColor = new ColorDecorador(productoBase, "Rojo");
Console.WriteLine(productoColor.ObtenerDescripcion());
Console.WriteLine(productoColor.ObtenerPrecio());
List<string> accesorios = new List<string> { "Estuche", "Cargador" };
IProducto productoAccesorios = new AccesoriosDecorador(productoBase, accesorios);
Console.WriteLine(productoAccesorios.ObtenerDescripcion());
Console.WriteLine(productoAccesorios.ObtenerPrecio());