O Patrón Obxecto Lixeiro ou Patrón Flyweight serve para eliminar ou reducir a redundancia cando temos gran cantidade de obxectos que conteñen información idéntica, ademais de lograr un equilibrio entre flexibilidade e rendemento (uso de recursos)

  • Clasificación: estrutural
  • Propósito: Uso compartido dun gran número de obxectos lixeiros (ou de grao fino) para aumentar a eficiencia.

Motivación editar

Problema: No contexto dun editor de documentos empréganse obxectos para representar os seus elementos: táboas, figuras, caracteres etc. Ademais desexase tratar ós elementos de forma uniforme. O problema é que manter un obxecto para cada letra por exemplo pode resultar moi caro.

Unha solución a este problema é compartir obxectos que poidan empregarse o mesmo tempo en diferentes contextos. A estes obxectos denominarémolos obxectos lixeiros o flyweight.

O obxecto lixeiro ou flyweight actúa como un obxecto independente que non se diferencia do obxecto compartido. A Distinción no estado do obxecto lixeiro (por exemplo no formato da letra ou o carácter que se representa) faise tendo en conta o estado intrínseco, que é o estado interno almacenado dentro do obxecto lixeiro e é independente do contexto no que se usa (por exemplo a letra que representa); e o estado extrínseco, que e ó estado que depende do contexto no que se atopa o obxecto de modo que no obxecto lixeiro non pode ser compartido (a posición e o formato ou o estilo que se lle da ó carácter). Os responsables de proporcionar este estado extrínseco ó obxecto lixeiro cando o necesite son os clientes.

Aplicabilidade editar

A aplicabilidade deste patrón dase cando se desexan compartir obxectos que cumpren unhas determinadas condicións, algunhas delas son: non se depende da identidade entre obxectos, a existencia dun gran número de obxectos que se desexan compartir, cando o custo de almacenamento dos mesmos é alto debido a gran cantidade de obxectos que se requiren, se a maior parte do estado do obxecto pode facerse extrínseco e moitos grupos de obxectos poden reempregarse por relativamente poucos obxectos compartidos ao eliminar o estado extrínseco.

Estrutura editar

Participantes editar

  • ObxectoLixeiro ou Flyweight: Declara a interface mediante a cal os obxectos lixeiros reciben e actúan sobre o estado extrínseco.
  • ObxectoLixeiroConcreto ou ConcreteFlyweight: Complementa a interface do obxecto lixeiro engadindo o estado intrínseco.
  • ObxectoLixeiroNoCompartido ou UnsharedConcreteFlyweight: Pode facerse obxectos coa interface do obxecto lixeiro que non se compartan. En xeral estes obxectos conteñen outros obxectos lixeiros (fila, columna etc).
  • FábricaDeObxectosLixeiros ou FlyweightFactory: Crea e xestiona os obxectos lixeiros e asegura o correcto compartir dos obxectos lixeiros.
  • Cliente ou Client: Manteñen referencias a obxectos lixeiros e calcula (ou almacena) o estado extrínseco dos obxectos lixeiros.

Colaboración entre participantes editar

Os clientes non instancian directamente os obxectos lixeiros, senón que delegan esta responsabilidade na fábrica de obxectos lixeiros para a correcta xestión da compartición destes.

O estado extrínseco é almacenado ou calculado polos clientes e proporcionado ós obxectos lixeiros cando estes o necesitan.

Consecuencias editar

As consecuencias que supón a utilización deste patrón é unha redución nos custos do almacenamento, xa que se reduce no número total de instancias e se empregan un só estado intrínseco por obxecto, a custa dunha penalización debida ó cálculo do estado extrínseco.

Implementación editar

Á hora de implementar este patrón teranse en conta os seguintes aspectos:

A aplicabilidade do patrón ven dada polo fácil que é identificar o estado extrínseco e eliminalo dos obxectos compartidos.

En canto á xestión dos obxectos compartidos, os clientes non deberían crear instancias de eles directamente senón que é a fábrica de obxectos lixeiros a que lle permite ós clientes obter un obxecto lixeiro concreto.

Véxase tamén editar

Ligazóns externas editar

Páxina de patróns de deseño (en inglés)