Skip to content

Instantly share code, notes, and snippets.

@Danielusuario
Created May 13, 2024 04:53
Show Gist options
  • Save Danielusuario/0f752f702d0ebd9f270a33814af754f5 to your computer and use it in GitHub Desktop.
Save Danielusuario/0f752f702d0ebd9f270a33814af754f5 to your computer and use it in GitHub Desktop.

Nombre: Osvaldo Daniel Ramirez Ruiz

NO.C: 20210617

Actividad de Patrones de Diseño: Singleton y Decorador en C#

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.

Escenario

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).

Tareas

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

1. Definición de Clases

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.

2. Lógica de Interacción

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.

3. Prueba del Sistema

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.

image

Codigo del programa

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());
    }
}
@IoTeacher
Copy link

revisado

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment