Os patróns de programación son técnicas ben coñecidas e probadas para resolver determinados problemas de programación.

Un dos patróns é o Patrón Singletón que serve para acceder a recursos (ficheiros, conexións a base de datos) onde so se pode crear unha única instancia dese acceso (so unha conexión a BD, …). Para evitar que se creen varios accesos a dito recurso empregase as técnicas índicadas neste patrón..

As técnicas que recolle este patrón para resolver dito problema son:

  • A visibiliade do constructor é privada, co que non é instanciable esta clase directamente, e así evitase que se vain creando varios accesos ao recurso (varias instancias do obxeto de acceso ao recurso)
  • Dispón dun método público e estático (método de clase) para obter o acceso ao recurso, método ao que se chamará cada vez que se quere obter un acceso a ese recurso
  • Dentro dese método, e empregando unha propiedade estática (de clase), comprobarase se xa se creou unha instancia do obxeto de acceso (que estará gardada se así foi nesa propiedade estática). Se non se creou, crease e gardase nesa propiedade; e en calquera caso devolvese o gardado nese propiedad (é dicir, se non se creou un obxeto de acceso, crease, e se non devolvese o existente, co que se evita crear varias instancias)
  • A súa implementación en PHP5 é a seguinte:

    class PatronSingleton
    {
        // Contenedor Instancia da Clase
        private static $instancia;
    
        // O constructor non é accesible
        private function __construct()
        {
            echo 'Son o constructor';
        }
    
        // O metodo accesible
        public static function singleton()
        {
            if (!isset(self::$instancia)) {
                $c = __CLASS__;
                self::$instancia = new $c;
            }
            return self::$instancia;
        }
    }
    
    $obxeto1 = PatronSingleton::singleton();
    $obxeto2 = PatronSingleton::singleton();
    

    Por exemplo, para realizar a conexión a un servidor de BD MySQL empregando este patrón de diseño:

    class accesoDB
    {
        // Contenedor Instancia da Clase
        private static $instancia;
        private $id_conexion;	
    
        // O constructor non é accesible
        private function __construct()
        {
            $this->id_conexion = mysql_connect("localhost","usuario","contrasinal");
        }
    
        // O metodo accesible
        public static function getAcceso()
        {
            if (!isset(self::$instancia)) {
                $c = __CLASS__;
                self::$instancia = new $c;
            }
    
            return self::$instancia;
        }
    
        public function getIdConexion() {
            return $this->id_conexion;
        }
    }
    
    $obxeto1 = accesoDB::getAcceso();
    var_dump($obxeto1->getIdConexion());
    $obxeto2 = accesoDB::getAcceso();
    var_dump($obxeto2->getIdConexion());
    

    Como se pode ver, devolvese sempre o mesmo identificador de recurso de conexión a BD, independentemente das veces que se emprege.