ValorSentimental / docs /dao_factory.md
iagofp's picture
Diagramas
d639ab2
classDiagram
    class DaoFactory {
        -usuario_dao UsuarioDao
        -pelicula_dao PeliculaDao
        -emocion_dao EmocionDao
        -historial_dao HistorialDao
        -ciclo_dao CicloDao
        +obtener_usuario_dao() UsuarioDao
        +obtener_pelicula_dao() PeliculaDao
        +obtener_emocion_dao() EmocionDao
        +obtener_historial_dao() HistorialDao
        +obtener_ciclo_dao() CicloDao
    }

    class UsuarioDao {
        -bd ConexionBD
        +obtener_conexion() Connection
    }

    class PeliculaDao {
        -bd ConexionBD
        +obtener_conexion() Connection
    }

    class EmocionDao {
        -bd ConexionBD
        +obtener_conexion() Connection
    }

    class HistorialDao {
        -bd ConexionBD
        +obtener_conexion() Connection
    }

    class CicloDao {
        -bd ConexionBD
        +obtener_conexion() Connection
    }

    DaoFactory --> UsuarioDao : crea/devuelve
    DaoFactory --> PeliculaDao : crea/devuelve
    DaoFactory --> EmocionDao : crea/devuelve
    DaoFactory --> HistorialDao : crea/devuelve
    DaoFactory --> CicloDao : crea/devuelve

Implementar DaoFactory

class DaoFactory:
    _daos = {}
    
    @staticmethod
    def obtener_usuario_dao() -> UsuarioDao:
        if 'usuario' not in DaoFactory._daos:
            DaoFactory._daos['usuario'] = UsuarioDao()
        return DaoFactory._daos['usuario']

Agregar Interfaz Base para DAOs

from abc import ABC, abstractmethod

class BaseDao(ABC):
    def __init__(self):
        self._bd = ConexionBD.instancia()
    
    @abstractmethod
    def obtener_por_id(self, id): pass
    
    @abstractmethod
    def crear(self, obj): pass
    
    @abstractmethod
    def actualizar(self, obj): pass
    
    @abstractmethod
    def eliminar(self, id): pass