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