Patrones De Diseño

Patrones de diseño I: dominando el patrón singleton

¿Que pasa muchachos? Con este post inicio una nueva serie de artículos que espero que lleguen a buen puerto. Esta serie de artículos va a tratar sobre algo muy importante en el desarrollo, los patrones de diseño. Conocerlos puede marcar la diferencia entre ser un pica códigos del montón a conseguir un buen puesto de trabajo como Senior Developer – Analista Programador. Además conocer los diferentes patrones de diseño te ayudará a desarrollar un código mejor, mas limpio y que coño, te hará sentir mejor profesional así que vamos con ello…

Dominando el patrón singleton

He decidido empezar por el patrón singleton porque es el mas básico que tienes que conocer. Personalmente no es el que mas me guste pero para avanzar en otros patrones de diseño mas complejos por aquí se puede ir adquiriendo una buena base.

El patrón singleton lo utilizamos cuando queremos tener una instancia única de una clase con un único punto de acceso global para todos los clientes que la requieran, en otras palabras, con el patrón singleton nos aseguramos que una clase solo instancia una vez.

¿Cuando nos interesa elegir este patrón? Pues cuando tenemos por ejemplo objetos que han de ser atómicos, por ejemplo la conexión con la base de datos o el email sender. Imagínate que por cada consulta a la base de datos tuviéramos que crear una nueva instancia y abrir la conexión, a la larga esto afectaría al rendimiento de la aplicación pudiendo llegar a llenar el heap del sistema.

Para aplicar el patrón singleton tenemos que tener un constructor privado en nuestra clase que solo sea accesible desde la misma clase, también necesitaremos una instancia privada de la clase y métodos estáticos que devuelvan la instancia.

<?php

 namespace Patrones\Singleton\Database;

 class Database 
 {
     private static $instance;
     private $db;

     private function __construct(){
         $this->db = new PDO("mysql:host=server;dbname=database", "user", "password");
     }

     public function getInstance(){
         if(!isset(self::$instance)){
             $class = __CLASS__;
             self::$instance = new $class;
         }
         return self::$instance;
     }

     public function __clone(){
         trigger_error('No puedes hacer eso hamijo', E_USER_ERROR);
     }
 }

?>

Como veis, en la clase Database, he definido una propiedad privada llamada $instance, esta es la variable que almacenará toda la clase cuando la instanciemos. Después está el constructor por defecto con un acceso privado, esto lo utilizamos para inicializar todo lo que necesitemos iniciarlizar, en el ejemplo, la cadena de conexión con la base de datos.

La función getInstance() se encarga de comprobar si ya existe una instancia definida, de ser así la devuelve, en caso contrario crea una nueva mediante el uso de la constante __CLASS__ que nos devuelve el nombre de la clase.

Por último el método mágico __clone() controla que no se puedan instanciar mas objetos de esta clase y así saltarse el patrón singleton por el arco del triunfo…

Para utilizarlo es tan sencillo como llamar al método estático getInstance() de la clase y ya nos devolverá una instancia totalmente funcional de la clase Database.

<?php

 require_once 'Database.class.php';

 $conexion = Database::getInstance();
 
?>

Con este primer artículo pretendía introducirte en el maravilloso mundo de los patrones de diseño y mas concretamente en el patrón singleton, en este enlace puedes aprender más sobre este patrón. Voy a colgar este ejemplo en mi github para que os lo podáis clonar y meterle mano a vuestro gusto.

 

Y permaneced atentos por que aún quedan muchos patrones por explicar como el Modelo Vista Controlador, el Adapter, el Data Access Object, el Factory… en fin…

¡Hala a cascarla!

Gorka Muñoz Andrés

Me llamo Gorka Muñoz y soy un desarrollador melómano. Combino a la perfección la búsqueda de nuevos grupos con la pasión por la tecnología. Desde chiquitito me ha gustado la programación, ahora que soy mayor estoy metido en el mundo del SEO sin olvidarme del /Dev.

This Post Has 2 Comments

  1. Pablo Oneto

    Muy buen artículo: simple y conciso! Utilizo mucho Singleton según en que aplicativos

    1. Gorka Muñoz Andrés

      Muchas gracias. En próximos post hablaré sobre otros patrones 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *