1+ # Author: Jheison Duban Quiroga Quintero
2+ # Github: https://github.com/JheisonQuiroga
3+
4+ """/*
5+ * EJERCICIO:
6+ * Explora el patrón de diseño "singleton" y muestra cómo crearlo
7+ * con un ejemplo genérico.
8+ *
9+ """
10+
11+
12+ # Implementación básica
13+ class Singleton :
14+ _instance = None
15+
16+ def __new__ (cls ):
17+ if cls ._instance == None :
18+ cls ._instance = super (Singleton , cls ).__new__ (cls )
19+
20+ return cls ._instance
21+
22+ sin1 = Singleton ()
23+ print (sin1 )
24+ sin2 = Singleton ()
25+ print (sin2 )
26+ print (sin1 is sin2 ) # True
27+
28+
29+ """* DIFICULTAD EXTRA (opcional):
30+ * Utiliza el patrón de diseño "singleton" para representar una clase que
31+ * haga referencia a la sesión de usuario de una aplicación ficticia.
32+ * La sesión debe permitir asignar un usuario (id, username, nombre y email),
33+ * recuperar los datos del usuario y borrar los datos de la sesión.
34+ */"""
35+
36+ class UserSession ():
37+ _instance = None
38+
39+ def __new__ (cls ):
40+ if cls ._instance is None :
41+ print ("Creando nueva sesión de usuario!" )
42+ cls ._instance = super (UserSession , cls ).__new__ (cls )
43+ # Inicializar el estado de la sesión vacia
44+ cls ._instance ._user_data = None
45+ return cls ._instance
46+
47+ def set_user (self , user_id , username , name , email ):
48+ self ._user_data = {
49+ "id" : user_id ,
50+ "username" : username ,
51+ "name" : name ,
52+ "email" : email ,
53+ "is_authenticated" : True
54+ }
55+
56+ print (f"Usuario { username } ha iniciado sesión." )
57+ return self ._user_data
58+
59+ def get_user (self ):
60+ """Método para obtener los datos del usuario"""
61+ if not self ._user_data :
62+ print ("No hay ningún usuario en la sesión." )
63+ return None
64+ else :
65+ return self ._user_data
66+
67+ def is_authenticated (self ):
68+ """Verifica si hay un usuario autenticado en la sesión"""
69+ return self ._user_data is not None and self ._user_data .get ("is_authenticated" , False )
70+
71+ def logout (self ):
72+ """Borra todos los datos de la sesión"""
73+ if self ._user_data :
74+ username = self ._user_data ["username" ]
75+ self ._user_data .clear ()
76+ print (f"Usuario { username } ha cerrado la sesión" )
77+ return True
78+ else :
79+ return False
80+
81+ if __name__ == "__main__" :
82+
83+ # Caso de uso sesión usuario
84+ user1 = UserSession ()
85+ print ("Usuario Autenticado?:" , user1 .is_authenticated ())
86+
87+ # Establecemos un usuario
88+ user1 .set_user (1 , "johndoe" , "John Doe" , "johndoe@fake.com" )
89+ print ("Usuario Autenticado?:" , user1 .is_authenticated ())
90+ print (user1 .get_user ())
91+
92+ # Creamos otra instancia de la sesión (DEBE SER LA MISMA)
93+ user2 = UserSession ()
94+ print ("Sesión 1 es sesión 2?:" , user1 is user2 )
95+
96+ print ("Usuario en sesion 1:" , user1 .get_user ()["username" ])
97+ print ("Usuario en sesion 2:" , user2 .get_user ()["username" ])
98+
99+ # Cerramos sesión
100+ user2 .logout ()
101+
102+ # Verificamos en ambas sesiones
103+ print ("sesion 1 Autenticado?:" , user1 .is_authenticated ())
104+ print ("sesion 2 Autenticado?:" , user2 .is_authenticated ())
0 commit comments