You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Refactoriza `RegistroPedidos` aplicando el patrón **Singleton (versión thread-safe con lazy initialization)** para que **todos los baristas usen la misma instancia compartida**.
174
174
175
175
¿Listo para intentarlo?
176
-
¿Quieres que también te sugiera pasos guía para la refactorización?
176
+
177
+
---
178
+
179
+
Perfecto. Aquí tienes una **guía paso a paso para refactorizar el código de la cafetería aplicando el patrón Singleton**. Estos pasos están diseñados para que tú mismo implementes la solución, guiado por los principios GoF.
180
+
181
+
---
182
+
183
+
## 🛠️ Guía de Refactorización: Aplicando Singleton a `RegistroPedidos`
184
+
185
+
---
186
+
187
+
### 1️⃣ **Detecta el problema**
188
+
189
+
Hazte estas preguntas:
190
+
191
+
* ¿Por qué hay múltiples instancias de `RegistroPedidos`?
192
+
* ¿Qué pasa con los pedidos registrados por diferentes baristas?
193
+
* ¿Cuál sería la consecuencia si varios hilos acceden a este objeto?
194
+
195
+
---
196
+
197
+
### 2️⃣ **Haz el constructor privado**
198
+
199
+
Para evitar que otros creen nuevas instancias directamente:
200
+
201
+
```csharp
202
+
private RegistroPedidos() { }
203
+
```
204
+
205
+
---
206
+
207
+
### 3️⃣ **Declara una instancia estática privada**
208
+
209
+
Esto será el acceso central:
210
+
211
+
```csharp
212
+
private static RegistroPedidos _instancia;
213
+
```
214
+
215
+
---
216
+
217
+
### 4️⃣ **Agrega un mecanismo para controlar el acceso (Lazy y Thread-safe)**
218
+
219
+
Usa un candado (`lock`) para evitar problemas en entornos multihilo:
220
+
221
+
```csharp
222
+
private static readonly object _candado = new object();
223
+
```
224
+
225
+
---
226
+
227
+
### 5️⃣ **Crea un método público estático para obtener la instancia**
228
+
229
+
Este método será el **único punto de acceso**:
230
+
231
+
```csharp
232
+
public static RegistroPedidos ObtenerInstancia()
233
+
{
234
+
lock (_candado)
235
+
{
236
+
if (_instancia == null)
237
+
{
238
+
_instancia = new RegistroPedidos();
239
+
}
240
+
return _instancia;
241
+
}
242
+
}
243
+
```
244
+
245
+
---
246
+
247
+
### 6️⃣ **Reemplaza todas las creaciones de instancia directas**
248
+
249
+
En `Main()`, cambia de:
250
+
251
+
```csharp
252
+
var registro = new RegistroPedidos();
253
+
```
254
+
255
+
a:
256
+
257
+
```csharp
258
+
var registro = RegistroPedidos.ObtenerInstancia();
259
+
```
260
+
261
+
---
262
+
263
+
### 7️⃣ **Verifica si el estado ahora es compartido**
264
+
265
+
Al ejecutar `MostrarPedidos()` desde diferentes "baristas", todos deben ver la **misma lista unificada**.
266
+
267
+
---
268
+
269
+
### 8️⃣ **Bonus: Protege el estado interno**
270
+
271
+
Considera si necesitas:
272
+
273
+
* Validar duplicados.
274
+
* Agregar métodos para borrar, reiniciar o exportar pedidos.
275
+
* Testear usando una interfaz o simulacro (mock).
276
+
277
+
---
278
+
279
+
### 9️⃣ **Reflexiona**
280
+
281
+
* ¿Qué ventajas trajo el Singleton?
282
+
* ¿Hubo alguna limitación?
283
+
* ¿Sería mejor usar Dependency Injection en lugar de Singleton?
0 commit comments