O O Flyweight é um padrão de projeto estrutural que permite que os programas suportem grandes quantidades de objetos, mantendo baixo o consumo de memória.
O padrão consegue isso compartilhando partes do estado do objeto entre vários objetos. Em outras palavras, o Flyweight economiza RAM armazenando em cache os mesmos dados usados por objetos diferentes.
Exemplos de uso: O padrão Flyweight é raramente usado em aplicações PHP devido à própria natureza da linguagem. Um script PHP normalmente funciona com uma parte dos dados do aplicativo e nunca carrega tudo na memória ao mesmo tempo.
Identificação: O Flyweight pode ser reconhecido por um método de criação que retorna objetos em cache em vez de criar novos.
Exemplo conceitual
Este exemplo ilustra a estrutura do padrão de projeto Flyweight. Ele se concentra em responder a estas perguntas:
De quais classes ele consiste?
Quais papéis essas classes desempenham?
De que maneira os elementos do padrão estão relacionados?
Depois de aprender sobre a estrutura do padrão, será mais fácil entender o exemplo a seguir, com base em um caso de uso PHP do mundo real.
index.php: Exemplo conceitual
Output.txt: Resultados da execução
Exemplo do mundo real
Antes de começarmos, observe que as aplicações reais para o padrão Flyweight no PHP são bastante escassas. Isso decorre da natureza de thread única do PHP, onde você não deveria armazenar TODOS os objetos do seu aplicativo na memória ao mesmo tempo, na mesma thread. Embora a ideia para este exemplo seja apenas meio séria e o problema inteiro da RAM possa ser resolvido estruturando o aplicativo de maneira diferente, ele ainda demonstra o conceito do padrão como ele funciona no mundo real. Tudo bem, eu lhe dei o aviso. Agora, vamos começar.
Neste exemplo, o padrão Flyweight é usado para minimizar o uso de RAM dos objetos em um banco de dados de animais de uma clínica veterinária somente para gatos. Cada registro no banco de dados é representado por um objeto Cat. Seus dados consistem em duas partes:
Dados únicos (extrínsecos), como nome, idade e informações do proprietário de um animal de estimação.
Dados compartilhados (intrínsecos), como nome da raça, cor, textura etc.
A primeira parte é armazenada diretamente dentro da classe Cat, que atua como um contexto. A segunda parte, no entanto, é armazenada separadamente e pode ser compartilhada por vários gatos. Esses dados compartilháveis residem na classe CatVariation. Todos os gatos com recursos semelhantes estão vinculados à mesma classe CatVariation, em vez de armazenar os dados duplicados em cada um de seus objetos.