Descripción de la Actividad Objetivo: Aplicar los patrones de diseño Singleton y Decorador para construir un sistema de configuración de productos personalizados en una tienda en línea.
Una tienda en línea que permite a los usuarios personalizar productos con diferentes opciones y accesorios, asegurando que la configuración de las opciones sea única (Singleton) y que se puedan agregar características adicionales dinámicamente (Decorador).
Implementar el patrón Singleton para manejar una única instancia de configuración del producto. Utilizar el patrón Decorador para permitir añadir características adicionales a los productos de manera flexible. Crear clases para productos básicos y decoradores concretos que representen características opcionales. Desarrollar una interfaz gráfica de usuario donde los clientes puedan personalizar sus productos y ver el precio final. Implementación
Clase ConfiguracionProducto: (Singleton)
Atributos privados para almacenar la configuración del producto. Método estático para obtener la instancia única. Interfaz Producto:
Método getDescripcion que devuelve una descripción del producto. Método getPrecio que devuelve el precio del producto. Clase ProductoBase: Implementa Producto.
Descripción básica y precio inicial del producto. Clases Decorador: (Decorador)
ColorDecorador: Añade opciones de color al producto. AccesoriosDecorador: Añade accesorios como estuches, cargadores, etc.
Explicacion en base al codigo:
Clase ConfiguracionProducto (Singleton):
Esta clase almacena la configuración del producto de manera única en toda la aplicación.
Tiene atributos privados para almacenar la descripción y el precio del producto.
Implementa el patrón Singleton, lo que significa que solo puede haber una instancia de esta clase en todo el programa.
Proporciona un método estático ObtenerInstancia() para obtener la instancia única de ConfiguracionProducto.
Interfaz Producto:
Define dos métodos: GetDescripcion() y GetPrecio() para obtener
la descripción y el precio del producto, respectivamente.
Clase ProductoBase:
Implementa la interfaz Producto.
Representa un producto básico con una descripción y un precio iniciales.
Clases Decorador:
ColorDecorador:
Añade opciones de color al producto.
Extiende el comportamiento del producto base modificando su descripción y precio para incluir el color seleccionado.
AccesoriosDecorador:
Añade accesorios como estuches, cargadores, etc., al producto.
Modifica la descripción y el precio del producto base para incluir los accesorios seleccionados.
Los usuarios inician la configuración de un producto seleccionando un ProductoBase. Añaden características mediante decoradores, los cuales ajustan la descripción y el precio del producto base conforme se agregan. La configuración del producto se maneja mediante la instancia única de ConfiguracionProducto, asegurando que todas las modificaciones se reflejan en tiempo real y son coherentes.
Los usuarios inician la configuración de un producto seleccionando un ProductoBase.
Luego, pueden añadir características adicionales al producto mediante decoradores,
como ColorDecorador y AccesoriosDecorador.
Cada decorador modifica la descripción y el precio del producto
base para reflejar las características adicionales seleccionadas.
La configuración del producto se maneja a través de la
instancia única de ConfiguracionProducto, asegurando que todas las
modificaciones se reflejen en tiempo real y sean coherentes en toda la aplicación.
Instanciar la clase ConfiguracionProducto y asegurarse de que siempre se obtenga la misma instancia. Crear un ProductoBase y decorarlo con diferentes opciones para verificar que los precios y descripciones se actualizan correctamente. Interactuar con la interfaz de usuario para personalizar un producto y validar que el sistema responde como se espera.
using System;
// Clase ConfiguracionProducto (Singleton)
public class ConfiguracionProducto
{
private static ConfiguracionProducto instancia; // Instancia única del objeto ConfiguracionProducto
private string descripcion; // Descripción del producto
private decimal precio; // Precio del producto
// Constructor privado para evitar la creación de instancias fuera de la clase
private ConfiguracionProducto()
{
descripcion = "Producto base"; // Descripción inicial del producto base
precio = 100.0m; // Precio inicial del producto base
}
// Método estático para obtener la instancia única del objeto ConfiguracionProducto
public static ConfiguracionProducto ObtenerInstancia()
{
if (instancia == null)
{
instancia = new ConfiguracionProducto(); // Creación de la instancia solo si no existe una previa
}
return instancia;
}
// Propiedades para acceder a la descripción y precio del producto
public string Descripcion { get => descripcion; set => descripcion = value; }
public decimal Precio { get => precio; set => precio = value; }
}
// Interfaz Producto
public interface Producto
{
string GetDescripcion(); // Método para obtener la descripción del producto
decimal GetPrecio(); // Método para obtener el precio del producto
}
// Clase ProductoBase: Implementa Producto
public class ProductoBase : Producto
{
// Implementación del método GetDescripcion para el producto base
public string GetDescripcion()
{
return "Producto base"; // Descripción del producto base
}
// Implementación del método GetPrecio para el producto base
public decimal GetPrecio()
{
return 100.0m; // Precio del producto base
}
}
// Clases Decorador: Decorador abstracto
public abstract class Decorador : Producto
{
protected Producto productoDecorado; // Producto al que se aplican decoraciones
// Constructor que recibe el producto a decorar
public Decorador(Producto productoDecorado)
{
this.productoDecorado = productoDecorado;
}
// Implementación del método GetDescripcion
public virtual string GetDescripcion()
{
return productoDecorado.GetDescripcion(); // Devuelve la descripción del producto base
}
// Implementación del método GetPrecio
public virtual decimal GetPrecio()
{
return productoDecorado.GetPrecio(); // Devuelve el precio del producto base
}
}
// Clase ColorDecorador: Añade opciones de color al producto
public class ColorDecorador : Decorador
{
// Constructor que recibe el producto al que se aplicará el decorador de color
public ColorDecorador(Producto productoDecorado) : base(productoDecorado)
{
}
// Implementación del método GetDescripcion para el decorador de color
public override string GetDescripcion()
{
return productoDecorado.GetDescripcion() + ", con color"; // Agrega "con color" a la descripción
}
// Implementación del método GetPrecio para el decorador de color
public override decimal GetPrecio()
{
return productoDecorado.GetPrecio() + 10.0m; // Añade $10 al precio del producto base
}
}
// Clase AccesoriosDecorador: Añade accesorios como estuches, cargadores, etc.
public class AccesoriosDecorador : Decorador
{
// Constructor que recibe el producto al que se aplicarán los accesorios
public AccesoriosDecorador(Producto productoDecorado) : base(productoDecorado)
{
}
// Implementación del método GetDescripcion para el decorador de accesorios
public override string GetDescripcion()
{
return productoDecorado.GetDescripcion() + ", con accesorios"; // Agrega "con accesorios" a la descripción
}
// Implementación del método GetPrecio para el decorador de accesorios
public override decimal GetPrecio()
{
return productoDecorado.GetPrecio() + 20.0m; // Añade $20 al precio del producto base
}
}
// Clase principal
class Program
{
static void Main(string[] args)
{
// Configuración del producto (Singleton)
ConfiguracionProducto configuracion = ConfiguracionProducto.ObtenerInstancia();
// Producto base
Producto producto = new ProductoBase();
Console.WriteLine("Producto base:");
Console.WriteLine("Descripción: " + producto.GetDescripcion());
Console.WriteLine("Precio: $" + producto.GetPrecio());
// Decorador de color
producto = new ColorDecorador(producto);
Console.WriteLine("\nProducto con color:");
Console.WriteLine("Descripción: " + producto.GetDescripcion());
Console.WriteLine("Precio: $" + producto.GetPrecio());
// Decorador de accesorios
producto = new AccesoriosDecorador(producto);
Console.WriteLine("\nProducto con accesorios:");
Console.WriteLine("Descripción: " + producto.GetDescripcion());
Console.WriteLine("Precio: $" + producto.GetPrecio());
}
}
revisado