Los patrones de diseño de la Banda de los Cuatro han tenido un impacto significativo en el desarrollo de software. Estos patrones se han integrado en lenguajes modernos como Python y JavaScript, y son fundamentales para abordar desafíos comunes en el diseño orientado a objetos.
Los patrones de diseño se dividen en tres categorías principales:
Cada categoría tiene un propósito único y aborda problemas específicos en la arquitectura de software.
Los patrones creacionales se centran en la instanciación de clases y la creación de objetos. Algunos de los patrones más importantes son:
| Patrón | Descripción |
|---|---|
| Singleton | Asegura que una clase tenga solo una instancia y proporciona acceso global a ella. |
| Constructor | Separa la construcción de un objeto de su representación, permitiendo diferentes representaciones. |
| Prototipo | Especifica los objetos a crear mediante una instancia prototípica que se puede copiar. |
| Método de Fábrica | Define interfaces para crear objetos, permitiendo a las subclases decidir qué clase instanciar. |
| Fábrica Abstracta | Proporciona una interfaz para crear familias de objetos relacionados sin especificar una clase concreta. |
Los patrones estructurales se ocupan de cómo se pueden componer clases y objetos para formar estructuras más grandes. Algunos de los patrones más destacados son:
| Patrón | Descripción |
|---|---|
| Adaptador | Permite que clases con interfaces incompatibles trabajen juntas. |
| Puente | Desvincula una abstracción de su implementación para que puedan evolucionar de forma independiente. |
| Compuesto | Componen objetos en una estructura de árbol para representar jerarquías. |
| Decorador | Añade nuevas funcionalidades a los objetos de forma dinámica. |
| Fachada | Proporciona una interfaz sencilla para un conjunto de clases. |
| Flyweight | Minimiza el uso de memoria al compartir datos entre objetos similares. |
| Proxy | Proporciona un marcador de posición para controlar el acceso a otro objeto. |
Los patrones de comportamiento se centran en los algoritmos y la asignación de responsabilidades entre objetos. Algunos de los patrones más relevantes son:
| Patrón | Descripción |
|---|---|
| Iterador | Proporciona acceso secuencial a los elementos de un objeto agregado sin exponer su representación. |
| Estrategia | Define una familia de algoritmos, encapsulando cada uno y haciéndolos intercambiables. |
| Método de Plantilla | Define el esqueleto de un algoritmo, dejando algunos pasos para las subclases. |
Los patrones de diseño han evolucionado a lo largo de décadas para abordar desafíos comunes en el diseño orientado a objetos. Es valioso considerar estos patrones como posibles soluciones al enfrentar problemas de diseño. Sin embargo, su naturaleza técnica puede dificultar su comprensión y aplicación efectiva.
Con la ayuda de modelos de lenguaje como ChatGPT, los desarrolladores pueden identificar cuándo un patrón puede ser una buena solución y cómo implementarlo en el código. En el próximo video, se explorará el patrón Singleton, que es uno de los más sencillos de entender de la Banda de los Cuatro.
En este documento se presenta un resumen sobre el patrón de diseño Singleton, su implementación en Python y su utilidad en el desarrollo de aplicaciones móviles. Se discuten los desafíos de la gestión de memoria en sistemas operativos móviles y cómo el patrón Singleton puede ayudar a mantener un estado global en la aplicación.
Los sistemas operativos móviles, como iOS y Android, son estrictos en la administración de memoria y recursos. Si una aplicación consume demasiados recursos, puede ser ralentizada o cerrada inesperadamente. Por lo tanto, es crucial manejar eficientemente la memoria al diseñar aplicaciones.
El patrón Singleton es una solución a los problemas mencionados, permitiendo que una clase tenga solo una instancia y proporcionando un acceso global a sus datos y métodos.
A continuación se presenta un ejemplo básico de cómo implementar el patrón Singleton en Python:
class Singleton:
_instance = None
@staticmethod
def getInstance():
if Singleton._instance is None:
Singleton._instance = Singleton()
return Singleton._instance
_instance: Inicialmente establecida en None. Se utiliza para verificar si ya existe una instancia de la clase.getInstance: Permite acceder a la instancia única de la clase sin necesidad de crear una nueva.Para hacer el Singleton más útil, se pueden agregar datos y métodos. A continuación se muestra una versión mejorada que incluye un diccionario de configuración:
class Singleton:
_instance = None
def __init__(self):
self.config = {}
@staticmethod
def getInstance():
if Singleton._instance is None:
Singleton._instance = Singleton()
return Singleton._instance
def set_config(self, key, value):
self.config[key] = value
def get_config(self, key):
return self.config.get(key, None)
Para utilizar el Singleton y almacenar configuraciones:
singleton_instance = Singleton.getInstance()
singleton_instance.set_config('database', 'PostgresSQL')
another_instance = Singleton.getInstance()
print(another_instance.get_config('database')) # Salida: PostgresSQL
Para comprobar que ambas instancias son la misma:
assert singleton_instance is another_instance # Esto debe ser verdadero
El patrón Singleton es una solución efectiva para mantener un estado global en aplicaciones, especialmente en entornos donde la gestión de recursos es crítica. Sin embargo, existen otros 22 patrones de diseño que pueden ser igualmente útiles en diferentes escenarios.
En el futuro, se explorará cómo utilizar modelos de lenguaje (LLM) como ChatGPT para validar y experimentar con diferentes patrones de diseño, mejorando así la calidad del código y evitando errores comunes.
El uso de patrones de diseño, como el Singleton, es fundamental para el desarrollo de aplicaciones eficientes y bien estructuradas. La comprensión y aplicación de estos patrones puede facilitar la creación de soluciones robustas en el desarrollo de software.
En este curso, se explora el uso de patrones de diseño, específicamente el patrón Singleton, en el desarrollo de aplicaciones móviles, así como la integración de modelos de lenguaje (LLM) para mejorar el código. Se presenta un ejemplo práctico de una aplicación de servicios financieros que utiliza una base de datos de series temporales para gestionar datos de precios de acciones.
| Patrón de Diseño | Descripción |
|---|---|
| Singleton | Controla el acceso a una única instancia de una clase, ideal para conexiones a bases de datos. |
| Método de Fábrica | Proporciona una interfaz para crear objetos en una superclase, permitiendo a las subclases alterar el tipo de objetos que se crean. |
| Método de Plantilla | Define el esqueleto de un algoritmo en una operación, permitiendo a las subclases redefinir ciertos pasos. |
| Estrategia | Permite seleccionar un algoritmo en tiempo de ejecución, útil para el algoritmo de calificación. |
Este resumen proporciona una guía sobre cómo utilizar patrones de diseño en el desarrollo de software y cómo los LLM pueden facilitar este proceso. Se anima a los participantes a experimentar con el código y aplicar los conocimientos adquiridos.
En este curso, se exploran patrones de diseño de software, específicamente el patrón Singleton y el patrón de Fábrica, aplicados a una aplicación de base de datos que gestiona datos de precios de acciones. Se discuten las implicaciones de estos patrones en la eficiencia del código y la seguridad.
DatabaseConnection: Se crea una clase que gestiona la conexión a la base de datos SQLite.class DatabaseConnection:
_instance = None
@staticmethod
def get_connection():
if DatabaseConnection._instance is None:
DatabaseConnection._instance = DatabaseConnection()
return DatabaseConnection._instance
get_connection debe ser estático para evitar confusiones en la instanciación de la clase.Sin método estático:
python
db1 = DatabaseConnection()
db2 = DatabaseConnection()
db1 y db2 son la misma instancia, pero el código puede ser confuso.Con método estático:
python
conn = DatabaseConnection.get_connection()
| Patrón | Ventajas |
|---|---|
| Singleton | - Única instancia - Ahorro de recursos - Facilidad de depuración |
| Fábrica | - Creación de objetos simplificada - Flexibilidad en la creación |
En este curso, se explora la implementación de patrones de diseño en una aplicación de base de datos para gestionar información sobre empresas y sus precios bursátiles. Se discuten los patrones Singleton y Factory, destacando cómo el patrón Factory puede mejorar la flexibilidad y la gestión de diferentes tipos de empresas, incluyendo aquellas que no tienen un símbolo de cotización.
class CompanyFactory:
@staticmethod
def get_company(identifier):
if isinstance(identifier, str):
return DomesticCompany(identifier)
elif isinstance(identifier, int):
return ForeignCompany(identifier)
else:
raise ValueError("Invalid identifier type")
class DomesticCompany:
def __init__(self, ticker):
self.ticker = ticker
class ForeignCompany:
def __init__(self, identifier):
self.identifier = identifier
El uso de patrones de diseño como Singleton y Factory puede mejorar significativamente la estructura y flexibilidad de una aplicación de base de datos, permitiendo una gestión más eficiente de diferentes tipos de empresas. Se anima a los participantes a experimentar con el código y considerar nuevas implementaciones.
En este curso, se exploran diversos patrones de diseño aplicados a una simulación de una aplicación real para servicios financieros. Se discuten los patrones Singleton, Factory y Template, y se muestra cómo estos pueden mejorar la eficiencia y flexibilidad del código en el análisis de datos de series temporales.
Patrón Singleton: Asegura que una clase tenga una única instancia y proporciona un punto de acceso global a ella. Se utiliza para gestionar conexiones a bases de datos de manera eficiente y segura.
Patrón Factory: Permite crear subclases de una clase base, facilitando la gestión de diferentes tipos de empresas (nacionales y extranjeras) en la aplicación.
El patrón Template se utiliza para definir el esqueleto de un algoritmo, permitiendo que las subclases modifiquen partes del mismo sin cambiar su estructura.
def process_time_series(self):
self.load_time_series()
self.calculate_bollinger_bands()
self.preprocess_data()
self.evaluate_strategy()
self.postprocess_data()
Subclases: Las subclases pueden anular métodos como preprocess_data y postprocess_data para implementar comportamientos específicos.
Ejemplo de Anulación:
class ForeignCompany(Company):
def postprocess_data(self):
print("Postprocesando datos de una empresa extranjera.")
| Patrón | Descripción | Beneficios |
|---|---|---|
| Singleton | Asegura una única instancia de una clase. | Eficiencia en la gestión de recursos. |
| Factory | Crea subclases de una clase base. | Flexibilidad en la creación de objetos. |
| Template | Define el esqueleto de un algoritmo permitiendo modificaciones en subclases. | Estructura clara y reutilización de código. |
Este resumen proporciona una visión general de cómo los patrones de diseño pueden ser aplicados en el desarrollo de aplicaciones financieras, destacando su importancia en la creación de software eficiente y flexible.
En este documento se aborda el patrón de diseño Strategy, que permite crear una familia de algoritmos intercambiables. Este patrón es útil para implementar diferentes estrategias de clasificación, facilitando la selección de la estrategia más adecuada en función del contexto.
Se define una clase abstracta GradingStrategies con un método abstracto assign_grade.
from abc import ABC, abstractmethod
class GradingStrategies(ABC):
@abstractmethod
def assign_grade(self, company):
pass
class BollingerBandStrategy(GradingStrategies):
def assign_grade(self, company):
if company.last_value > company.upper_band:
return 'A'
elif company.last_value < company.lower_band:
return 'C'
else:
return 'B'
class ThresholdStrategy(GradingStrategies):
def assign_grade(self, company):
if company.last_value > 200:
return 'A'
elif company.last_value < 100:
return 'C'
else:
return 'B'
Para utilizar las estrategias en el código, simplemente se pasa la estrategia deseada al método de calificación.
# Ejemplo de uso
company = get_company_details() # Función que obtiene los detalles de la empresa
# Usando la estrategia de bandas de Bollinger
grading_strategy = BollingerBandStrategy()
grade = grading_strategy.assign_grade(company)
# Usando la estrategia de umbral
grading_strategy = ThresholdStrategy()
grade = grading_strategy.assign_grade(company)
El patrón Strategy es una herramienta poderosa en la programación que permite mejorar la calidad del código y facilitar la implementación de diferentes algoritmos. Al utilizar este patrón, los desarrolladores pueden crear software más flexible y mantenible, aprovechando al máximo las herramientas disponibles para ser mejores programadores.
Este documento resume las habilidades y conocimientos adquiridos en el curso sobre el uso de Modelos de Lenguaje Grande (LLM) como ChatGPT para mejorar las capacidades de codificación. A lo largo de tres módulos, se exploraron conceptos clave en serialización de datos, diseño de bases de datos y patrones de diseño de software.
Pickle: Herramienta para serializar objetos complejos y preservar estados de aplicaciones.
Aplicación Práctica:
Operaciones CRUD: Crear, Leer, Actualizar y Borrar datos en bases de datos.
Uso de LLM:
ChatGPT como experto en bases de datos, ayudando a superar desafíos complejos y a crear bases de datos escalables y fáciles de mantener.
Tecnologías Utilizadas:
Patrones Utilizados:
Aplicación Práctica:
Las habilidades adquiridas son solo el comienzo. Los LLM seguirán siendo aliados en el desarrollo.
Consejo para Desarrolladores:
No permitir que el LLM dicte el código. Es fundamental entender completamente el código generado para evitar problemas futuros.
Crecimiento Profesional:
Gracias por participar en este curso. Se alienta a los estudiantes a seguir experimentando, aprendiendo y codificando para un futuro prometedor en el desarrollo de software. ¡Feliz programación!
Este documento resume las habilidades y conocimientos adquiridos en el curso sobre el uso de Modelos de Lenguaje Grande (LLM) como ChatGPT para mejorar las capacidades de codificación. A lo largo de tres módulos, se exploraron conceptos clave en serialización de datos, diseño de bases de datos y patrones de diseño de software.
Pickle: Herramienta para serializar objetos complejos y preservar estados de aplicaciones.
Aplicación Práctica:
Operaciones CRUD: Crear, Leer, Actualizar y Borrar datos en bases de datos.
Uso de LLM:
ChatGPT como experto en bases de datos, ayudando a superar desafíos complejos y a crear bases de datos escalables y fáciles de mantener.
Tecnologías Utilizadas:
Patrones Utilizados:
Aplicación Práctica:
Las habilidades adquiridas son solo el comienzo. Los LLM seguirán siendo aliados en el desarrollo.
Consejo para Desarrolladores:
No permitir que el LLM dicte el código. Es fundamental entender completamente el código generado para evitar problemas futuros.
Crecimiento Profesional:
Gracias por participar en este curso. Se alienta a los estudiantes a seguir experimentando, aprendiendo y codificando para un futuro prometedor en el desarrollo de software. ¡Feliz programación!