1+ """
2+ #23 - Patron de diseño Singleton
3+ """
4+ # Es un patron de diseño que se asegura que una clase solamente tenga una instancia
5+ # Proporciona un punto de acceso global a esa instancia
6+ # En pocas palabras es tener algo que todos usan
7+ # Ejemplo: Un telefono fijo en la casa
8+
9+ """
10+ Estrucutra basica
11+ """
12+ # _instance: Variable para guardar un objeto unico
13+ # __new__: Controla si ya existe un objeto o si hay que crearlo
14+ # Si hay un objeto, no se crea otro, solo se devuelve
15+
16+ class AlgoUnico :
17+ _instance = None # Caja donde guardamos el objeto unico
18+
19+ def __new__ (cls ): # Funcion que decide que hacer
20+ if cls ._instance is None : # Si la caja esta vacia
21+ cls ._instance = super ().__new__ (cls ) # Crea el objeto si no existe
22+ return cls ._instance # Devuelve lo que hay en la caja
23+
24+ """
25+ Como se compone
26+ """
27+ # La clase: Define que cosa unica estamos creando(telefono, una impresora...)
28+ # Variable estatica _instance: Almacena el unico objeto y compoartida por toda la clase
29+ # Control de creacion __new__: Asegura que no se hagan copias extras
30+ # Atributos o metodos: Lo que quiero que haga el Singleton
31+
32+
33+ """
34+ Para que se usa
35+ """
36+ # Cuando se necesita un solo recurso compartido en todo el programa
37+ # Se quiere que todos accedan a lo mismo y vean los mismo cambios
38+ # Evitar desperdiciar memoria creando muchas copias innecesarias
39+
40+
41+ """
42+ Ejemplo 1
43+ """
44+ # Cafetera compartida en una oficina
45+
46+ class Cafetera :
47+ _instance = None
48+
49+ def __new__ (cls ):
50+ if cls ._instance is None :
51+ cls ._instance = super ().__new__ (cls )
52+ cls ._instance .tipo_cafe = 'expresso' # Sabor inicial
53+ return cls ._instance
54+
55+ def cambiar_cafe (self , nuevo_tipo ):
56+ self .tipo_cafe = nuevo_tipo
57+ print (f'La cafetera ahora tiene { self .tipo_cafe } ' )
58+
59+ cafetera1 = Cafetera ()
60+ cafetera2 = Cafetera ()
61+
62+ print (cafetera1 .tipo_cafe )
63+ cafetera2 .cambiar_cafe ('Americano' )
64+ print (cafetera1 .tipo_cafe )
65+ print (cafetera1 is cafetera2 )
66+
67+
68+ """
69+ Ejemplo 2
70+ """
71+ # Control tv en casa
72+
73+ class ControlTv :
74+ _instance = None
75+
76+ def __new__ (cls ):
77+ if cls ._instance is None :
78+ cls ._instance = super ().__new__ (cls )
79+ cls ._instance .volumen_tv = 10
80+ return cls ._instance
81+
82+ def subir_volumen (self ):
83+ self .volumen_tv += 5
84+ print (f'El volumen ahora es de { self .volumen_tv } ' )
85+
86+
87+ control1 = ControlTv ()
88+ control2 = ControlTv ()
89+
90+ print (control1 .subir_volumen ())
91+ print (control2 .subir_volumen ())
92+
93+
94+ """
95+ Extra
96+ """
97+
98+ class SesionUsuario :
99+ _instance = None
100+
101+ id : int = None
102+ uesername : str = None
103+ name : str = None
104+ mail : str = None
105+
106+ def __new__ (cls ):
107+ if not cls ._instance :
108+ cls ._instance = super (SesionUsuario , cls ).__new__ (cls )
109+ return cls ._instance
110+
111+
112+ def set_user (self , id , username , name , mail ):
113+ self .id = id
114+ self .uesername = username
115+ self .name = name
116+ self .mail = mail
117+
118+ def get_user (self ):
119+ return f'ID: { self .id } , Username: { self .uesername } , Nombre: { self .name } , Email: { self .mail } '
120+
121+ def clear_user (self ):
122+ self .id = None
123+ self .uesername = None
124+ self .name = None
125+ self .mail = None
126+
127+
128+ session1 = SesionUsuario ()
129+ print (session1 .get_user ())
130+ session1 .
set_user (
1 ,
"mouredev" ,
"Brais Moure" ,
"[email protected] " )
131+ print (session1 .get_user ())
132+
133+ session2 = SesionUsuario ()
134+ print (session2 .get_user ())
135+
136+ session3 = SesionUsuario ()
137+ session3 .clear_user ()
138+ print (session3 .get_user ())
0 commit comments