Aprendre plegats
divendres, d’abril 01, 2005
 
ES2(40) Singletons
El programa de l'assignatura ES2 inclou tres patrons de disseny que els estudiants han d'aprendre pel seu compte. La justificació és que hi ha molts patrons de disseny, que no els podem explicar tots a classe i que, per tant, és important que sapiguem aprendre nous patrons de manera autònoma.

Un d'aquests patrons és el patró singletó. En Matemàtiques, un singletó és un conjunt format per un sol element. Què és en patrons de disseny de programari?.

Si voleu podeu usar aquesta entrada del blog per "aprendre plegats" aquest patró de disseny. Idees de coses que podeu comentar (si ho creieu útil):
  1. Bibliografia que considereu bona.
  2. Descriure què fa el patró.
  3. Indicar exemples d'utilització del patró.
  4. És pot garantir que una classe no tindrà mai més d'una instància?. Com?.
  5. És millor un singletó que una classe amb operacions (i atributs) de classe?. Per què?.
  6. Té sentit definir subclasses de singletons?
Mireu d'aprendre el patró abans del proper exercici de control (poden sortir-ne preguntes). Per altra banda, aviat el farem servir en els exercicis del curs.

Comments:
Hola,

aquest patró s'utilitza quan necessitem tenir una classe que tingui exactament una instància i sempre hàgim de treballar amb aquesta. Ens hem d'assegurar de que cap programador creï una nova instància d'aquesta classe i que sempre treballi amb la única instància creada.

Exemples habituals d'aquest patró són el gestor de finestres, el sistema de fitxers, el mouse, etc. No té sentit tenir més d'una instància de qualsevol d'aquests exemples i, a més, si les tinguéssim generaríem errors.

Una possible solució per a garantir que només hi haurà una instància de la classe és definir la seva constructora com a privada, de tal manera que si algú vol crear una instància des de fora de la classe li llanci una excepció. Tindrem un atribut dins la classe que sigui una instància de la mateixa, i una operació per a poder obtenir aquesta classe des de fora i treballar amb ella.

Crec que definir subclasses de singletons no té sentit, ja que, si un singletó només té una instància d'ell mateix, només podríem usar una de les possibles subclasses i les altres no s'utilitzarien mai. Si per qüestions de disseny ens és més clar definir només una subclasse del singletó aleshores si que crec que funcionaria.

Espero no haver-me equivocat massa...
Aquí teniu la bibliografia que he trobat útil:

Definició amb exemple:
http://www.object-arts.com/EducationCentre/Patterns/Singleton.htm

Definició i implementació en C#:
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=486

Definició i explicació en detall de la seva implementació en Java:
http://www.magnolia.info/wiki/attach?page=HelpfulThings%2FDesign+Pattern+Singleton.pdf

Oriol Nieto
 
El company ha deixat clar el concepte de singletó, però veient els exemples a mi s’hem plantegen alguns dubtes: tot esta reduït a l’àmbit del sistemes operatius? Si només tenim una instància, no podríem usar variables globals?
He buscat i el que he trobat es que els singletons pertanyen a serveix que acostumen a ser molt estàtics al llarg de la seva vida i són objectes del quals només pot haver una única instància, un exemple fora dels SO seria un cas del sistema d’accés a una base de dades.
Comparteixo la opinió que ha de ser el propi singletó el que gestioni la seva pròpia creació a través d’un mètode privat ja que només ha d’existir una sola instància i ningú més ha de poder crear-ne d’altres.
Sobre l’aspecte de l’ús de variables globals, crec que és millor la classe, aquesta no només és més elegant, sinó que permet assegurar-nos del distanciament de la implementació i permet crear millor mecanismes per controlar l’accés.
Sobre si l’ús de subclasses és útil o no, el primer que un pensa es que no té gaire sentit usar-ne, però si bé l’usuari sempre usarà només una instància, des de el punt de dispensadors se’m ocorren dos casos en els quals seria útil l’ús de subclasses:
· La creació de diferents singletons que comparteixen parts comunes i que poden tenir operacions amb comportament similar que podríem definir com a abstractes. Per exemple, podríem definir una classe “Singletó” amb subclasses “SingMouse”, “SingTeclat” o “SingDisk”, i totes elles tenen un mètode read() que en primer cas ens dóna la posició del cursos, en el segon un caràcter llegit de teclat i en el tercer un byte de disc.
· La creació de singletons amb parts comunes, però diferents funcionalitats. Per exemple per garantir la compatibilitat d’un sistema, creariem la superclasse “SingMouse” amb les seves subclasses “Mouse2butons” i “Mouse3butons”, només una de les dues subclasses existiria però això permetria la instal·lació de diferents dispositius, a més que facilitaria l’addició de nous models.

- Defnició:
http://c2.com/cgi/wiki?SingletonPattern

- Conflictes amb subclasses
http://c2.com/cgi/wiki?InheritedJavaSingletonProblem

- Singletons are Evil: no deixeu de llegir Theological debate
http://c2.com/cgi/wiki?SingletonsAreEvil

- Exemple d’implmentació en Java
http://radio.weblogs.com/0122027/stories/2003/10/20/implementingTheSingletonPatternInJava.html
 
naucil veliko
 
Envejo la teva capacitat per publicar article meravellós - simplement volia dir que m'agrada això!
 
Publica un comentari a l'entrada

<< Home

Powered by Blogger