El patrón de diseño singleton
Bueno antes de empezar a hablar como perico acerca de este patrón de diseño déjenme les doy el significado de singleton sacado de wilipedia (le enciclopedia del pobre).
Para los que solo hablan perro ahí les va la traducción al español“Generally, a singleton is something which exists alone in some way”
“generalmente un singleton es algo que existe solo de cierta manera”
Ahora vamos a definir lo que es un patrón de diseño
a design pattern is a general repeatable solution to a commonly-occurringEn perro
problem
un patrón de diseño es una solución representada de manera generar para unOk entonces juntando las dos definiciones tenemos que un patrón de diseño singleton es la manera en la cual podemos restringir la creación de una clase a uno o solo algunos objetos.
problema recurrente
Pero que chingados quiere decir eso, bueno esto quiere decir que es una manera en la cual yo voy a diseñar mi clase para que solo se pueda crear una instancia de la misma o dicho de otro modo es la manera en la cual una clase solo puede crear un objeto.
Ya le van agarrando, bueno ya se que algunos de ustedes se están haciendo la siguiente pregunta --para que chingados quiero yo un madre de estas, de que me sirve que una clase tenga una instancia solamente. Para contestar la pregunta imaginemos esta situación,
Ustedes están a cargo de desarrollar el modulo de contabilidad de un programa administrativo el cual cuanta con una arquitectura de tres capas. La capa de usuario reside en la PC del usuario, los objetos del negocio residen en un servidor central el cual para acabarla de joder esta en la china o algún otro lugar bien lejos del usuario. Y la capa de datos esta en un servidor juntito a la base de datos. Ok tu como desarrollador necesitas validar ciertas reglas de negocio, para hacer esto necesitas crear un objeto de una clase llamada bisRuleEngine la cual como parte de su comportamiento carga todas las reglas de negocio en una colección interna.
Suponiendo que tu quieres usar ese objeto, lo que tendrías que hacer al cargar la forma seria algo como esto
rules = new bisRuleEngine ( );
y donde necesites evaluar la regla de negocio usarías algo así
if (rules.eval (“ruel0001”) == true ) {
…….
}
Pero o sorpresa el triste objeto cada ves que lo instancias se tiene que serializar desde el servidor en donde reside la clase con todo el montón de reglas de negocio (asumamos que el guey que lo diseño era un pendejo y que diseño el motor de reglas para que cargara TODAS la reglas de una base de datos,, que para dramatizar nuestro ejemplo son como 5000).Ahora supongamos que tu desarrollo abarca varias pantallas las cuales están en diferentes dlls, jars, o cualquier otro tipo de librería que gustes y mandes, te imaginas que lentitud seria que cada vez que el usuario abra una pantalla, esta cree un objeto de reglas de negocio y que al hacer esto se tenga que serializar desde el servidor en china, y para colmo la serializada es en XML y tu triste usuario cuenta con una conexión daill up de 56k.. A mi me han mentado la madre por menos que eso.
Ahora ya vez la utilidad del patrón de diseño singleton, en teoría la instanciada solo se haría una vez y después esa instancia se podría reutilizar a lo largo de la vida de la aplicación. Y digo en teoria porque estas a la merced del alcnce de vida del objeto, aquí se tendria que implementar un diseño para que nos permitiera compartir los objetos entre formas o algo así, pero eso es arquitectura.
Ok suena chido pero como se le hace para implementar este patron de diseño? Bueno primero que nada necesitamos un lenguaje que soporte características orientadas a objetos. Y cual lenguaje creen ustedes que seleccione para mi ejemplo? brujos!!!! PHP.
- Para la implementación de este patrón de diseño vamos a seguir los siguientes pasos.
- Necesitamos descara una variable estática que contendrá la instancia de mi clase
Hacemos el constructor la clase privado para prevenir que la clase se instancie directamente, o sea utilizando la palabra reservada new. - Creamos un método publico con cualquier nombre (a mi me gusta usar getInstance porque se oye chingon y hasta parece que se lo que estoy haciendo) este método va a ser responsable de crear la instancia de la clase o de regresar la instancia existente.
En lugar de crear la instancia con la palabra reservada new se crea con el método getInstance ya que si se utiliza new falla porque el constructor es privado.
Y pues aquí esta el código
class bisRuleEngine {
// Necesitamos descara una variable estática que contendrá la instancia de mi clase
private static $instance;
private $messageText;
// Hacemos el constructor la clase privado para prevenir que la clase se instancie directamente, o sea utilizando la palabra reservada new.
private function __construct ( ) {
}
// Creamos un método publico con cualquier nombre
public function getInstance ( ) {
if ( self::$instance == NULL ) {
self::$instance = new bisRuleEngine ( );
}
return self::$instance;
}
// metodos de prueba para demostrar que sigo usando la misma instancia
public function Evaluate ( ruleNo ) {
return true;
}
public function setMessageText ( $value ) {
$this->messageText = $value;
}
public function getMessageText ( ) {
return $this->messageText;
}
function Show ( $msgId ) {
if ( $msgId == 1 ) {
echo "Mensaje informativo 1 \n";
}
else if ( $msgId == 2 ) {
echo "Mensaje de error 2 \n";
}
}
}
Eso es todo por el momento nos vemos luego, cuídense y no coman tierra.
Saludos.