Blog \ PHP
Patrones de Diseño - Uso del patrón Singleton en PHP PDF   Imprimir  
Publicado el Jueves, 02 de Septiembre de 2010 12:54

El concepto de Patrón

Los [Patrónes de Diseño] (Design Patterns) son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño, como la arquitectura (que de hecho es de donde surge la idea). Un patrón de diseño ofrece una solución abstracta a un problema de diseño que aparece muy frecuentemente, y su adaptación a las prácticas de la Ingeniería de Software surge tras la tesis de [Erich Gamma], publicados en un libro que recoge no sólo su de?nición, sino todo un catálogo de PDs aplicables a la programación básica orientada a objetos, y que cubren la mayor parte de los pequeños problemas recurrentes que se plantean en el desarrollo de cualquier programa.

Su objetivo principal es promover y mejorar la Reutilización dentro del software, y acá ya no hablamos solo de reutilización de código, sino de diseños y de [arquitecturas software], lo que hoy en día significa la utilización de Frameworks o Marcos de Trabajo, que basicamente son un diseño reutilizable de toda o parte de la arquitectura de un sistema, un esqueleto de una aplicación, que debe ser adaptado a necesidades concretas por el programador.

Además de los patrones de diseño también existe el concepto de [Antipatrón de Diseño], que es semejante a la idea de un patrón, pero intenta prevenir contra errores comunes de diseño en el software. La idea de los antipatrones es dar a conocer los problemas que acarrean ciertos diseños muy frecuentes, para intentar evitar que diferentes sistemas acaben una y otra vez en el mismo callejón sin salida por haber cometido los mismos errores.

 

Ejemplo: Uso del Patrón Singleton en PHP

En base a estas idas, un patrón de diseño puede ser implementado casi en cualquier lenguaje de programación. Cada lenguaje, dentro de su documentación, generalmente incluye implementaciones de estos distintos patrones.

Y un patrón que se utiliza muy frecuentemente es el patrón [Singleton]. El patrón de diseño Singleton se aplica a situaciones en las cuales es necesario tener una sola instancia de una clase dentro de la aplicación. Es muy común usar esto cuando queremos crear un objeto que va a ser accedido por diferentes partes de nuestra aplicación. Un claro ejemplo de es una conexión de base de datos.

Vamos a implementar algo parecido:

/**
    * Clase encargada de gestionar las conexiones a la BD
    * Implementa el patron Singleton
    *
    * @author elGolem
    */
    
    Class DB {
    /* Variables de conficuracion de la BD */
    private $host;
private $user;
private $pass;
private $db;

/* Variables de conexion y consultas */
private $conn;

/* Variable estatica para implementar el 
patron singleton */
private static $_instance;


/* Funcion encargada de crear, si es necesario, 
* el objeto. Esta es la funcion que debemos 
* llamar desde fuera de la clase para 
* instanciar el objeto DB
*/
public static function getInstance(){
    if (!(self::$_instance instanceof self)){
        self::$_instance = new self();
    }
    return self::$_instance;
}

/**
* Realiza la conexion con la base de datos establecida
*
* @return 
*
*/
public function connect(){
    //...
}

/**
* Ejecuta una sentencia SQL
*
* @param string $query
*/
public function execute($query){
    //...
}

/**
* Retorna la siguiente fila del resulset
* @return row
*/
public function getRow($result){
    //...
}


/**
* Cierra la conexion
*/
public function close(){
    //...
}

/* La funcion construct es privada para evitar que 
el objeto DB pueda ser creado mediante new */
private function __construct(){
    $this->setConnection();
}

/**
* Establece los parametros de la conexion
*/
private function setConnection(){
    //...
}

}    

Esta clase tiene algunas particularidades:

  1. El Constructor de la clase es privado , para evitar que se instancie fuera de la clase
  2. Posee un atributo $_instance donde almacena un puntero a la única instancia actual de la clase
  3. Posee un método estático getInstance(), que evalua si el atributo $_instance contiene una instacia de la propia clase (esto es, si la clase está instanciada) o no. Si ya existe, devuelve esa misma instancia al código que lo invoca. Si no, lo crea y lo retorna.

Solo es necesario invocar a este método cada vez que queramos obtener un objeto DB en nuestra aplicación:

/* Esta instruccion va a generar un error, porque 
el constructor en privado */
$mydb = new DB();

// Esta linea siempre va a devorlver la misma instancia de la clase en memoria
$mydb = DB::getInstance();
$mydb->connect();

// ... resto del codigo 
$mydb->close();    
    

Aclaración: La forma de invocar un miembro estático en PHP es mediante el operador de resolución ("::" o dobles dos puntos), mientras que para el resto de los miembrosde instancia se utiliza el operador "->".

El patrón Singleton es muy utilizado por librerías de PHP como PEAR, entre otras, que usan una mescla de miembros estáticos y miembros de instancia.

Y de esta manera, es como se implemeta un patrón de diseño en un lenguaje dado, como PHP. Los que deseen profundizar más sobre patrones pueden consultar la siguiente bibliografá o indagar por sus propios medios.

 

Referencias:

?

Autor Autor: elGolem   
Usar puntuación: / 2
MaloBueno 
  

Escribir un comentario

Por favor, intenta mantener tu opinión relacionada con el artículo en cuestión, no usar insultos, agresiones, o faltas de respeto al autor y otros participantes de la discusión. En caso de no hacerlo tu comentario será borrado. ¡Gracias por comentar!


  Llevame arriba!

Un poco sobre mi

mi_avatar Soy un diseñador y desarrollador web freelance, Programador Junior en .Net y estudiante de Sistemas en la Universidad Nacional de Entre Ríos. En este último tiempo me estoy dedicando a aprender un poco más sobre desarrollo de extensiones para Joomla! y sobre testing y debugging de aplicaciones de escritorio. Además soy un gran fanático de la ilustración y del arte gráfico.

Ver el perfil de Emmanuel  Fontán en LinkedIn

Licencia Creative Commons 2.5

Licencia Creative Commons
Blog El-Golem.com.ar por Emmanuel Fontan se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.

© 2010 El-Golem.com.ar - 1.0 (Beta) | Some Icons by www.2s-space.com Diseñado por elGolem | Powered by Joomla!