Foros del Web » Programando para Internet » PHP »

PHP OO Duda singlenton

Estas en el tema de Duda singlenton en el foro de PHP en Foros del Web. Hola buenas tardes compañeros mi duda es la siguiente: Como es bien sabido el patron de diseño singlenton es para crear instancia unica de una ...
  #1 (permalink)  
Antiguo 26/01/2013, 13:32
 
Fecha de Ingreso: diciembre-2005
Mensajes: 201
Antigüedad: 18 años, 3 meses
Puntos: 2
Pregunta Duda singlenton

Hola buenas tardes compañeros mi duda es la siguiente:


Como es bien sabido el patron de diseño singlenton es para crear instancia unica de una clase. he estado googleando y encontre varios ejemplos que usan este patron en clases con conexion a base de datos y estas clases incluyen metodos para enviar un string sql.Mi duda es ¿ Todas las clases que usan metodos para enviar string sql deben tener el mismo codigo del patron singlenton, es decir debiera copiar y pegar este codigo en cada clase que necesite crear una conexion y envio de string sql? o ¿Como puedoutilizar la misma instancia en mis otras clases para no estar repitiendo codigo?

Digo esto por que tengo la intencion de usar este patron de diseño en mi proyecto

Última edición por sagitariosTheBest; 26/01/2013 a las 14:14
  #2 (permalink)  
Antiguo 26/01/2013, 17:57
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda singlenton

Cita:
Iniciado por sagitariosTheBest Ver Mensaje
Hola buenas tardes compañeros mi duda es la siguiente:


Como es bien sabido el patron de diseño singlenton es para crear instancia unica de una clase. he estado googleando y encontre varios ejemplos que usan este patron en clases con conexion a base de datos y estas clases incluyen metodos para enviar un string sql.
Hasta ahí, dices que hay "clases que incluyen métodos"

Cita:
Iniciado por sagitariosTheBest Ver Mensaje
Mi duda es ¿ Todas las clases que usan metodos para enviar string sql deben tener el mismo codigo del patron singlenton,
Aquí, dices que los "usan"...No es lo mismo "incluir" (supongo que te refieres a "declarar") que "usar".

Lo que supongo que habrás visto, es la implementación de un Singleton para encapsular la conexión a la base de datos, de forma que sólo exista 1 instancia de esa clase conexión.

La base del patrón Singleton es crear una clase cuyo constructor es privado (por lo que no puede instanciarse con "new" desde fuera de la clase), un método estático "getInstance()", para obtener una instancia de la clase, y una variable estática "$instance", donde se asigna la instancia única de esa clase.
Esa variable $instance se inicializa a null, y se crea desde el método getInstance() cuando es llamado por primera vez.

La idea detrás del Singleton, es que la creación de instancias de una clase, esté controlada por esa misma clase.En el caso del Singleton, la clase se encarga de que sólo haya 1 instancia suya.Se pueden hacer variaciones de la misma idea.
Cita:
Iniciado por sagitariosTheBest Ver Mensaje
es decir debiera copiar y pegar este codigo en cada clase que necesite crear una conexion y envio de string sql?
Los patrones de diseño no están pensados precisamente para que copies y pegues código..Aquí tienes una implementación básica de un singleton:
Código PHP:
Ver original
  1. class conn
  2. {
  3.     static $instance=null;
  4.     private function __construct()   
  5.     {
  6.        echo "CONSTRUYENDO";
  7.     }
  8.     public static function getInstance()
  9.     {
  10.          if(conn::$instance==null)
  11.              conn::$instance=new conn();
  12.          return conn::$instance;
  13.     }
  14.     public function select($q)
  15.     {
  16.         echo $q;
  17.     }
  18. }

Y aquí, como obtener la instancia, y llamar a sus métodos
Código PHP:
Ver original
  1. $connection=conn::getInstance();
  2. $connection->select("HOLA");
  3. // La siguiente linea provoca un fatal error.
  4. // $ins=new conn();
  #3 (permalink)  
Antiguo 28/01/2013, 11:44
 
Fecha de Ingreso: diciembre-2005
Mensajes: 201
Antigüedad: 18 años, 3 meses
Puntos: 2
Pregunta Respuesta: Duda singlenton

Primeramente muchas gracias por tu respuesta megusto mucho, pero hay algo que no he comprendido bien y te agradeceria si me ayudaras otro poquito quiero concluir un poco mas a fondo.

Cita:
Los patrones de diseño no están pensados precisamente para que copies y pegues código..Aquí tienes una implementación básica de un singleton:


Código PHP:
    class conn
    
{
        static 
$instance=null;
        private function 
__construct()   
        {
           echo 
"CONSTRUYENDO";
        }
        public static function 
getInstance()
        {
             if(
conn::$instance==null)
                 
conn::$instance=new conn();
             return 
conn::$instance;
        }
        public function 
select($q)
        {
            echo 
$q;
        }
    } 
Lo que sigo sin entender es si esta clase de ejemplo que me muestras usa instancia unica de conexion entonces como puedo "reciclar este codigo" en otra clase que tambien ocupe de una conexion a la base de datos?
mi pregunta es hay que repetir este metodo de singlenton en la otra clase?
para evitar que el objeto cree mas de una conexion. es decir que el patron singlenton esta limitado a usarse en cada clase y al instaciar el objeto que ese objeto solo use una unica conexion?

pero si varios objetos son creados con esta logica habria no una instancia de conexion sino una conexion por cada objeto que necesite conectarse a la base de datos me explique?
  #4 (permalink)  
Antiguo 29/01/2013, 13:54
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Duda singlenton

Cita:
Iniciado por sagitariosTheBest Ver Mensaje
Lo que sigo sin entender es si esta clase de ejemplo que me muestras usa instancia unica de conexion entonces como puedo "reciclar este codigo" en otra clase que tambien ocupe de una conexion a la base de datos?
No entiendo a qué te refieres con que "ocupen" una conexión de base de datos...
Si "ocupen" es "usan", ambos objetos "usan" el singleton para obtener la instancia.

Si "ocupen" es "gestionen", porque quieres tener varias conexiones a base de datos (porque estás conectando a dos servidores distintos, o con dos usuarios distintos), y lo que quieres hacer es que cada conexión sea un singleton (asegurarte de que hay sólo una instancia de cada conexión), y a eso es a lo que llamas "reciclar", entonces es diferente.
Lo que llamas "reciclar", en OOP, siempre es herencia.Por lo tanto, necesitarás una clase base, y clases derivadas por cada conexion.
Digamos que la clase base se llama "ConexionGenerica", y las clases derivadas son "ConexionServerA' y 'ConexionServerB'.
La clase ConexionGenerica tendrá toda la funcionalidad de conectar a una base de datos, hacer queries, etc.
ConexionServerA y ConexionServerB, deben configurar ConexionGenerica con los parámetros que requieran.
Lo importante aqui es tener en cuenta que, de ConexionGenerica NO se pueden crear, ni obtener instancias.Y que ConexionServerA y ConexionServerB deben poder llamar al constructor de ConexionGenerica.
Para ello, ConexionGenerica tiene que tener su constructor definido como "protected", al igual que sus clases derivadas (en vez de "private").
La implementación sería así:

Código PHP:
Ver original
  1. class ConexionGenerica
  2. {
  3.    protected $host;
  4.    protected $user;
  5.    protected $password;
  6.    protected $db;
  7.    protected function __construct($host,$user,$password,$db)
  8.    {
  9.       /* Se realiza la conexion */
  10.    }
  11.    function query($q)
  12.    {
  13.      /* Realiza una query */
  14.    }
  15. }
  16. class ConexionServerA extends ConexionGenerica
  17. {
  18.    static $instance;
  19.    protected function __construct()
  20.    {
  21.      // Los parametros se obtienen de configuracion.Aqui supongo que son defines.
  22.      parent::__construct(HOST1,USER1,PASSWORD1,DB1);
  23.    }
  24.    static function getInstance()
  25.    {
  26.        if(!ConexionServerA::$instance)
  27.            ConexionServerA::$instance=new b();
  28.         return ConexionServerA::$instance;
  29.    }
  30. }
  31.  
  32. $h=ConexionServerA::getInstance();
  33. $h->query("Select ...");

La implementación de ConexionServerB es idéntica a ConexionServerA.Sólo cambian los parámetros pasados al constructor de ConexionGenerica.
  #5 (permalink)  
Antiguo 30/01/2013, 10:23
 
Fecha de Ingreso: diciembre-2005
Mensajes: 201
Antigüedad: 18 años, 3 meses
Puntos: 2
Sonrisa Respuesta: Duda singlenton

Esto es lo que estaba preguntando.
Cita:
Si "ocupen" es "gestionen", porque quieres tener varias conexiones a base de datos (porque estás conectando a dos servidores distintos, o con dos usuarios distintos), y lo que quieres hacer es que cada conexión sea un singleton (asegurarte de que hay sólo una instancia de cada conexión), y a eso es a lo que llamas "reciclar", entonces es diferente.
Quiero ir entendiendo lo que por ahi veo en libros e internet,muy bien esto es lo que queria muchisimas gracias me has ayudado mucho, perdon por no ser tan especifico y que tubieras que adivinar lo que estaba preguntando.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:51.