Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

duda singleton

Estas en el tema de duda singleton en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, me ha surgido una duda "basica" y necesito que me corroboren si estoy en lo correcto. La duda es: si quiero que mis clases ...
  #1 (permalink)  
Antiguo 12/12/2009, 21:20
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
duda singleton

Hola, me ha surgido una duda "basica" y necesito que me corroboren si estoy en lo correcto. La duda es:
si quiero que mis clases (base de datos, utilidades, template, modelos, etc) puedan usarse con cualquier controlador y/o modelo deberia crear un singleton en todas ellas? o es posible crear un singleton "general" que se encargue de esa tarea?
  #2 (permalink)  
Antiguo 13/12/2009, 01:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: duda singleton

Puedes usar el patrón Registry para eso.

Saludos.
  #3 (permalink)  
Antiguo 13/12/2009, 10:10
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: duda singleton

ya había escuchado mencionar ese patrón pero no sabía exactamente para que servía, voy a buscar e investigar sino les consulto de nuevo "gurues" jeje, y ahora una duda general, hay algun framework que utilice todos los patrones de diseño, cuando digo "todos" a al menos uno de cada una de estas categorias:
Cita:
Patrones creacionales [editar]

* Abstract Factory (Fábrica abstracta): Permite trabajar con objetos de distintas familias de manera que las familias no se mezclen entre sí y haciendo transparente el tipo de familia concreta que se esté usando.
* Builder (Constructor virtual): Abstrae el proceso de creación de un objeto complejo, centralizando dicho proceso en un único punto.
* Factory Method (Método de fabricación): Centraliza en una clase constructora la creación de objetos de un subtipo de un tipo determinado, ocultando al usuario la casuística para elegir el subtipo que crear.
* Prototype (Prototipo): Crea nuevos objetos clonándolos de una instancia ya existente.
* Singleton (Instancia única): Garantiza la existencia de una única instancia para una clase y la creación de un mecanismo de acceso global a dicha instancia.

Patrones Estructurales [editar]

* Adapter (Adaptador): Adapta una interfaz para que pueda ser utilizada por una clase que de otro modo no podría utilizarla.
* Bridge (Puente): Desacopla una abstracción de su implementación.
* Composite (Objeto compuesto): Permite tratar objetos compuestos como si de uno simple se tratase.
* Decorator (Envoltorio): Añade funcionalidad a una clase dinámicamente.
* Facade (Fachada): Provee de una interfaz unificada simple para acceder a una interfaz o grupo de interfaces de un subsistema.
* Flyweight (Peso ligero): Reduce la redundancia cuando gran cantidad de objetos poseen idéntica información.
* Proxy: Mantiene un representante de un objeto.

Patrones de Comportamiento [editar]

* Chain of Responsibility (Cadena de responsabilidad): Permite establecer la línea que deben llevar los mensajes para que los objetos realicen la tarea indicada.
* Command (Orden): Encapsula una operación en un objeto, permitiendo ejecutar dicha operación sin necesidad de conocer el contenido de la misma.
* Interpreter (Intérprete): Dado un lenguaje, define una gramática para dicho lenguaje, así como las herramientas necesarias para interpretarlo.
* Iterator (Iterador): Permite realizar recorridos sobre objetos compuestos independientemente de la implementación de estos.
* Mediator (Mediador): Define un objeto que coordine la comunicación entre objetos de distintas clases, pero que funcionan como un conjunto.
* Memento (Recuerdo): Permite volver a estados anteriores del sistema.
* Observer (Observador): Define una dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto cambie de estado se notifique y actualicen automáticamente todos los objetos que dependen de él.
* State (Estado): Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno.
* Strategy (Estrategia): Permite disponer de varios métodos para resolver un problema y elegir cuál utilizar en tiempo de ejecución.
* Template Method (Método plantilla): Define en una operación el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos, esto permite que las subclases redefinan ciertos pasos de un algoritmo sin cambiar su estructura.
* Visitor (Visitante): Permite definir nuevas operaciones sobre una jerarquía de clases sin modificar las clases sobre las que opera.
  #4 (permalink)  
Antiguo 13/12/2009, 14:14
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: duda singleton

Que yo sepa Zend usa Abstract Factory, Factory, Singleton, Adapter, Decorator, Chain of Responsibility , Iterator, Strategy, Template Method... seguramente varios otros tambien (ahora me vienen a la mente Table Data Gateway y Row Data Gateway por ej), el hecho de implementar patrones de diseño es uno de los puntos fuertes de Zend, digamos que forma parte de su filosofia


PD: el patron registry lo puedes implementar facilmente como un objeto contenedor de otros objetos, una implementacion a modo de ejemplo, que si quieres seguramente puedas usar sin mucho problema, como no, Zend_Registry (http://framework.zend.com/manual/en/zend.registry.html)

Saludos
  #5 (permalink)  
Antiguo 13/12/2009, 19:37
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: duda singleton

navegando por www.phpclasses.org en el grupo de diseño de patrones, encontre un ejemplo de registry en un framework que es asi:
Código PHP:
Ver original
  1. class registry
  2.     {
  3.         # vars that will be available globally
  4.          private $vars = array();
  5.        
  6.          public function __set($index, $value)
  7.          {
  8.             $this->vars[$index] = $value;
  9.          }
  10.        
  11.          public function __get($index)
  12.          {
  13.             return $this->vars[$index];
  14.          }
  15.     }

Es tan simple como eso?

después lo crea en el index.php de la aplicacion
Código PHP:
Ver original
  1. # include the config file
  2.     require 'config.php';
  3.  
  4.     # include the core files
  5.     require __SITE_PATH . '/core/' . 'controller.class.php';
  6.     require __SITE_PATH . '/core/' . 'registry.class.php';
  7.     require __SITE_PATH . '/core/' . 'router.class.php';
  8.     require __SITE_PATH . '/core/' . 'template.class.php';
  9.     require __SITE_PATH . '/core/' . 'model.class.php';
  10.     require __SITE_PATH . '/core/' . 'quickdb.class.php';
  11.  
  12.     # create new registry object
  13.     $registry = new registry;
  14.    
  15.     # create the database registry object
  16.     $registry->db = new QuickDB($__host, $__user, $__password, $__database);
  17.  
  18.     # load the router
  19.     $registry->router = new router($registry);
  20.    
  21.     # load the model
  22.     $registry->model = new model($registry->db, $registry->router->getFile());
  23.    
  24.     # load up the template
  25.     $registry->template = new template($registry);
  26.    
  27.     # load the controller
  28.     $registry->router->dispatch();
  29.    
  30.     ### end of the index file ###

y en la clase para los controladores usa algo asi:
Código PHP:
Ver original
  1. abstract class Controller
  2.     {
  3.         protected $registry; # protected so that it is accessible from other classes as well.
  4.        
  5.         function __construct($registry)
  6.         {
  7.             $this->registry = $registry;
  8.         }
  9.  
  10.         # all controllers must contain an index method
  11.         abstract function index();
  12.  
  13.         protected function redirect($url)
  14.         {
  15.             header('LOCATION: ' . html_entity_decode($url));
  16.             exit();
  17.         }
  18.        
  19.     }

y en los controladores del sistema asi:
Código PHP:
Ver original
  1. class error404Controller extends Controller
  2.     {
  3.         public function index()
  4.         {
  5.             $this->registry->template->blog_heading = '404 Error - Page Not Found !';
  6.             $this->registry->template->show('error404');
  7.         }
  8.     }
la verdad que pense que era mas complicado al ver lo que era la documentacion de como lo usa zend jejej
  #6 (permalink)  
Antiguo 14/12/2009, 06:53
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: duda singleton

sip, ese es un buen ejemplo
  #7 (permalink)  
Antiguo 14/12/2009, 09:56
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: duda singleton

perfecto, la ultima duda que tengo, si con el patron registry puedo usar los objetos creados en cualquier parte del sistema, cuando debo usar singleton ?
Código PHP:
Ver original
  1. $config= Config::singleton()
  #8 (permalink)  
Antiguo 14/12/2009, 10:08
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: duda singleton

Son cosas diferentes, singleton te garantiza una unica instancia en ejecucion, registry te permite acceder a los objetos desde cualquier parte

Respondiendo tu pregunta, debes usar singleton cuando quieras que un objeto se instancie una sola vez y las proximas veces que lo llames te devuelva siempre la misma instancia :D

Por ejemplo en el caso del registry, tiene sentido tener muchos registrys?? o quieres tener uno solo que lo uses en toda tu aplicacion?? aparentemente es una buena idea que el registry tambien implemente un singleton =)

Saludos
  #9 (permalink)  
Antiguo 14/12/2009, 12:42
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: duda singleton

lo que es ser "bruto" o "ignorante" jejejeje muchisimas gracias rodrigo me ha quedado mucho mas claro el panorama ahora
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 03:18.