Qué es el patrón Singleton
Antes de comenzar con el patron singleton en PHP, veamos la definición de lo que es el patrón singleton como tal.
Patron Singleton:
Garantiza que una clase solo tenga una instancia, y proporciona un punto de acceso global a ella.
-Desing Patterns – Elements of reusable object-oriented software – GoF
¿Para qué? Bueno esto tendría diferentes funcionalidades, como cuando queremos ahorrar memoria.
En este caso mas específico, que es PHP, utilizaré un ejemplo con el que en cierto momento me encontré y resulta que es bastante utilizado en entornos Web, el cual es el de una conexión con una base de datos.
Patrón Singleton en PHP para una conexión a una base de datos
Aquí nos comienza a sonar coherente el uso de este patrón de diseño, pues de esta manera en vez de crear varias veces una instancia para realizar la conexión (el cual representaría entre otras cosas un gasto innecesario de memoria), solo la creamos una vez cuando aún no hemos llamado a esta clase y al volver a llamarla (la segunda en adelante) estaremos obteniendo el valor de la misma conexión previamente utilizada.
Ya todo cobra sentido ¿No es así?
Ahora que tenemos motivo y comprensión para hacer esto, veamos un poco de código.
Primeramente debemos crear el método constructor como “private” para que no se pueda instanciar.
Luego crear una manera para crear una sola conexión o regresar una ya activa.
Esto lo logramos con algo tan simple como un if. Si la instancia no existe, la creamos.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class DataBase { static private $instance = null; private function __contruct() { } public static function getInst() { if (self::$instance == null) { self::$instance = new DataBase(); } return self::$instance; } } |
Esta es parte de nuestra clase, pero aún se ve un poco inútil, ¿cierto?
Bueno imaginemos que tenemos ciertas funciones dentro de la clase DataBase. Tales como:
1 2 3 4 5 6 7 8 9 10 11 |
public function connectToDB($data) { //Codigo } public function selectQuery($data) { //Codigo } public function insertQuery($data) { //Codigo } |
Y ahora para acceder a las funciones, debemos llamar getInst primero, luego llamar a la función especifica:
1 2 3 4 5 6 |
//Utilizando una variable donde guardamos la instancia. $db = Database::getInst(); $db->connectToDB($data); //Exactamente lo mismo, pero sin utilizar variables Database::getInst()->connectToDB($data); |
Si utilizamos:
1 2 |
$db = new DataBase(); //Nos retornara un error |
Ventajas del patrón Singleton en PHP
Ahora con el ejemplo completo, podemos nombrar ventajas mas específicas de este patrón de diseño en este ejemplo:
- La aplicación ahorrara recursos del servidor
- Al tener una sola instancia a la clase DataBase, evitará que tenga muchas conexiones innecesarias
- Tenemos un código un poco mas limpio y entendible
1.) Que nuestra aplicación web ahorre recursos del servidor.
2.) Tenemos bien controlado la creación de objetos, al no permitir que nuestra aplicación tenga innumerable y descontroladas conexiones innecesarias abiertas a una misma base de datos.
Usos generales
Ahora después de este ejemplo, podemos darnos cuenta que este patron de diseño nos puede ayudar cada que necesitemos mantener un dato, variable, o función, durante un tiempo sin guardarlo en la base de datos, por ejemplo sesiones, o serializaciones que comienzan a contar en X momento y después se pierde su valor.
Codigo en gitHub
https://github.com/balo215/SingletonPHP
Amigo esto es algo de novatos pero digamos que yo quiero repetir una consulta un determinado numero de veces por ejemplo que un insert este dentro de un ciclo for que mientras lleguen resultados ese ciclo se repite como lo haria con singleton?