He leído diferentes opiniones sobre el patrón singleton. Algunos sostienen que debe evitarse a toda costa y otros dicen que puede ser útil en ciertas situaciones.
Una situación en la que uso singletons es cuando necesito una fábrica (digamos un objeto f de tipo F) para crear objetos de cierta clase A. La fábrica se crea una vez usando algunos parámetros de configuración y luego se usa cada vez que un objeto de El tipo A es instanciado. Entonces, cada parte del código que quiere instanciar A obtiene el singleton f y crea la nueva instancia, por ejemplo
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Entonces, el escenario general es que
- Solo necesito una instancia de una clase, ya sea por razones de optimización (no necesito varios objetos de fábrica) o para compartir un estado común (por ejemplo, la fábrica sabe cuántas instancias de A todavía puede crear)
- Necesito una forma de tener acceso a esta instancia f de F en diferentes lugares del código.
No estoy interesado en la discusión sobre si este patrón es bueno o malo, pero suponiendo que quiero evitar usar un singleton, ¿qué otro patrón puedo usar?
Las ideas que tuve fueron (1) obtener el objeto de fábrica de un registro o (2) crear la fábrica en algún momento durante el inicio del programa y luego pasar la fábrica como parámetro.
En la solución (1), el registro en sí es un singleton, por lo que acabo de cambiar el problema de no usar un singleton de fábrica al registro.
En el caso (2) necesito alguna fuente inicial (objeto) de donde proviene el objeto de fábrica, así que me temo que volvería a recurrir a otro singleton (el objeto que proporciona mi instancia de fábrica). Siguiendo esta cadena de singletons, tal vez pueda reducir el problema a un singleton (la aplicación completa) mediante el cual todos los demás singletons se manejan directa o indirectamente.
¿Sería esta última opción (usando un singleton inicial que crea todos los demás objetos únicos e inyecta todos los demás singletons en los lugares correctos) una solución aceptable? ¿Es esta la solución que se sugiere implícitamente cuando se aconseja no usar singletons, o cuáles son otras soluciones, por ejemplo, en el ejemplo ilustrado anteriormente?
EDITAR
Como creo que algunos han entendido mal el punto de mi pregunta, aquí hay más información. Como se explica, por ejemplo , aquí , la palabra singleton puede indicar (a) una clase con un solo objeto de instancia y (b) un patrón de diseño utilizado para crear y acceder a dicho objeto.
Para aclarar las cosas, usemos el término objeto único para (a) y patrón singleton para (b). Entonces, sé cuáles son el patrón singleton y la inyección de dependencia (por cierto, últimamente he estado usando DI para eliminar instancias del patrón singleton de algún código en el que estoy trabajando).
Mi punto es que, a menos que el gráfico de todo el objeto sea instanciado de un solo objeto que vive en la pila del método principal, siempre será necesario acceder a algunos objetos únicos a través del patrón singleton.
Mi pregunta es si tener la creación y el cableado completos del gráfico de objetos depende del método principal (por ejemplo, a través de un poderoso marco DI que no usa el patrón en sí) es la única solución libre de patrón único .