patron getinstance diseño php mysql design-patterns singleton pdo

php - getinstance - ¿Sería Singleton un buen patrón de diseño para un sitio de microblogging?



self php (3)

Como dije antes, el singleton no te ayuda mucho con tu aplicación de blog. Solo crea una única instancia de base de datos y úsala.

Sidenode, lo que ves en PHP a menudo son "singletons falsos". Si se implementa como clase simple, generalmente implica el uso de un método ::getInstance() que implementa la solución única. Sin embargo, la existencia de la clase permite crear instancias de varios elementos (nuevo Singleton () && new Singleton ()). Por lo tanto, recomendaría un singleton de procedimiento, que no tiene este problema y es mucho más agradable para los ojos:

function db() { static $db; if (!isset($db)) { $db = new PDO("sqlite:memory"); } return $db; }

De esta forma puede usar db()->query("SELECT * FROM blog") y evitar importar siempre una var global $ db.

No he usado OO en el pasado en proyectos, ya que lo simplifiqué (de hecho, usando llamadas mysql_query arcaicas y mi propio filtrado), así que quería comenzar un nuevo proyecto, aprendiendo a usar patrones de diseño con mi OO en el camino .

Estaba buscando construir un sitio de microblogging para kicks, y encontré la clase de patrón de diseño singleton que parecía completa, y para usar con PDO no pude ver nada malo en ella (aparte de no poder acceder a dos bases de datos, que no soy seguro que necesitaría para este proyecto).

Por ejemplo, un proyecto como este, o un software simple de CMS, ¿sería una buena idea un singleton? ¿Qué tipo de patrones de diseño / tipo de clase de base de datos usarían "los tipos grandes" para estas cosas, sería esto demasiado restrictivo más adelante si se escalara (conexiones / rendimiento concurrentes)?

También había leído acerca de un singleton de fábrica para tratar con el manejo de conexiones adicionales más adelante, ya que es más simple cambiar el código en él. ¿Solucionaría esto alguno de los problemas negativos y lo convertiría en un patrón de diseño más adecuado para esto?


El objetivo de Singleton es limitar las instancias de objetos a uno y proporcionar acceso global.
Ambas son cosas que no quieres o no necesitas.

Limitar su instancia a una instancia es bastante inútil en PHP, donde esta restricción solo se aplica a las instancias en la solicitud actual . Si dos solicitudes llegan a su sitio de microblogging al mismo tiempo, seguirá habiendo una instancia por solicitud. Si quiere asegurarse de que solo hay una instancia, simplemente no instale una segunda instancia.

El acceso global tampoco es nada que desee, ya que rompe la encapsulación. Si necesita una determinada instancia dentro de sus objetos, páselos mediante inyección de dependencia . Eso es limpio y sostenible. Tiene la ventaja adicional de permitirle intercambiar fácilmente dependencias con otras implementaciones, como por ejemplo clases simuladas para las pruebas de su unidad .

Incluso Erich Gamma , uno de los inventores del patrón Singleton, cuestiona este patrón hoy en día:

"Estoy a favor de eliminar Singleton. Su uso es casi siempre un olor de diseño"

Es mejor que evites a Singletons.


Si no me equivoco, Singleton es un antipatrón . Pero dependiendo de la tarea, se puede usar.