Obxecto Lixeiro

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