Ver Mensaje Individual
  #4 (permalink)  
Antiguo 12/10/2011, 13:28
Avatar de Webstudio
Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años
Puntos: 69
Respuesta: Patron singleton y composicion

jataincubus, cómo estás?
Te cuento un poco como utilizo yo el tema de los Singletons, en algunas clases. Generalmente, como dicen Singletons no están mucho mejor que utilizar variables globales.

No es que estén mal de por si, solamente son complicadas a la hora de testear, en incluso hacen que tu código sea un poco más cerrado a cambios, por lo cual siempre es recomendable que tus clases puedan recibir clases como parámetros, y si no se lo definiste de antamano, utilizar alguna clase por defecto.

Esto es lo que hago yo:

Código PHP:
<?php
class ClaseA
{
    protected 
$_instance null;

    
/** Tipico Singleton */
    
public function getInstance()
    {
        if(
null === $this->_instance)
        {
            
$this->_instance = new self();
        }
        
        return 
$this->_instance;
    }
}

/** Esta es la clase que va a utilizar internamente a ClaseA */
class ClaseB 
{
    protected 
$_clasea null;

    public function 
__construct(ClaseA $clasea null)
    {
        
/** No pregunto si es null o no, seteo directamente */
        
$this->setClaseA($clasea);
    }
    
    public function 
setClaseA($clasea)
    {
        
/** acá tampoco pregunto, simplemente seteo */
        
$this->_clasea $clasea;
    }
    
    
/**
     * Acá viene "el truco". Cuando yo necesito utilizar una ClaseA, 
     * utilizo este método para pedirlo siempre. Si al momento de necesitarlo
     * no lo tengo instanciado, entonces recién acá lo instancio. Es 
     * una especie también de LazyLoad.
     */
    
public function getClaseA()
    {
        
/** Acá si pregunto si es null */
        
if(null === $this->_clasea) {
            
$this->_clasea ClaseA::getInstance();
        }
        return 
$this->_clasea;
    }
}
Así es como te quedan varias maneras de setear la clase interna, y si ninguna fue utilizada, entonces "defaulteas" a utilizar el Singleton:

Código PHP:
/** Setearlo al momento de instanciación */
$claseb = new ClaseB(new ClaseA);

/** Setearlo utilizando un método */
$claseb->setClaseA(new ClaseA);

/** Utilizando la versión por defecto si no se indicó antes */
$claseb = new ClaseB();
$clasea $claseb->getClaseA(); // Devuelve ClaseA::getInstance() 
Espero que te sirva esto !
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com