Skip to content

Commit f89b41c

Browse files
authored
Add refactoring guide for Singleton pattern implementation
Added a step-by-step guide for refactoring the 'RegistroPedidos' class to implement the Singleton pattern with thread-safety and lazy initialization.
1 parent 0984bec commit f89b41c

File tree

1 file changed

+109
-1
lines changed

1 file changed

+109
-1
lines changed

practicas/creacionales/singleton/readme.md

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,112 @@ namespace CafeteriaSingleton
173173
Refactoriza `RegistroPedidos` aplicando el patrón **Singleton (versión thread-safe con lazy initialization)** para que **todos los baristas usen la misma instancia compartida**.
174174

175175
¿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?
284+

0 commit comments

Comments
 (0)