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
----------

**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
--------------

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
---------

Participantes
-------------

* 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

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
-------------

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
--------------

Á 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
------------

### Ligazóns externas

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

|  |  |
| --- | --- |
| Control de autoridades | 
* Wd: Q1060964
* MAG: 115794218

 |