C# Design Pattern: Flyweight (Portugues)

Juarez Júnior - Oct 4 - - Dev Community

O padrão Flyweight é útil para economizar memória ao compartilhar objetos pesados que podem ser usados por várias instâncias. Neste exemplo, vamos trabalhar com ícones de arquivos. Cada tipo de arquivo (PDF, Word, Imagem) tem seu próprio ícone, mas muitos arquivos compartilham o mesmo ícone. Ao usar o Flyweight, podemos carregar o ícone uma única vez e reutilizá-lo para todos os arquivos do mesmo tipo, em vez de carregar a imagem repetidamente.

Exemplo de Código em C#:



// Flyweight: Ícone de Arquivo
public class IconeArquivo
{
    private string _nomeIcone;

    public IconeArquivo(string nomeIcone)
    {
        _nomeIcone = nomeIcone;
        Console.WriteLine($"Carregando ícone {_nomeIcone} da memória...");
    }

    public void Exibir(int tamanho)
    {
        Console.WriteLine($"Exibindo ícone {_nomeIcone} com tamanho {tamanho}.");
    }
}

// Flyweight Factory: Gerenciador de ícones de arquivos
public class IconeFactory
{
    private Dictionary<string, IconeArquivo> _icones = new Dictionary<string, IconeArquivo>();

    public IconeArquivo ObterIcone(string tipoArquivo)
    {
        if (!_icones.ContainsKey(tipoArquivo))
        {
            _icones[tipoArquivo] = new IconeArquivo(tipoArquivo);
        }
        return _icones[tipoArquivo];
    }
}

// Classe que representa um arquivo individual
public class Arquivo
{
    private string _nome;
    private IconeArquivo _icone;

    public Arquivo(string nome, IconeArquivo icone)
    {
        _nome = nome;
        _icone = icone;
    }

    public void Exibir()
    {
        Console.WriteLine($"Exibindo arquivo: {_nome}");
        _icone.Exibir(32);
    }
}

class Program
{
    static void Main(string[] args)
    {
        IconeFactory fabrica = new IconeFactory();

        // Carregar e compartilhar ícones para diferentes tipos de arquivos
        IconeArquivo iconePDF = fabrica.ObterIcone("PDF");
        IconeArquivo iconeWord = fabrica.ObterIcone("Word");
        IconeArquivo iconeImagem = fabrica.ObterIcone("Imagem");

        // Criar arquivos com ícones compartilhados
        Arquivo arquivo1 = new Arquivo("Documento1.pdf", iconePDF);
        Arquivo arquivo2 = new Arquivo("Documento2.pdf", iconePDF);
        Arquivo arquivo3 = new Arquivo("Relatório.docx", iconeWord);
        Arquivo arquivo4 = new Arquivo("Foto.jpg", iconeImagem);

        // Exibir arquivos com seus ícones
        arquivo1.Exibir();  // Saída: Exibindo arquivo: Documento1.pdf. Exibindo ícone PDF com tamanho 32.
        arquivo2.Exibir();  // Saída: Exibindo arquivo: Documento2.pdf. Exibindo ícone PDF com tamanho 32.
        arquivo3.Exibir();  // Saída: Exibindo arquivo: Relatório.docx. Exibindo ícone Word com tamanho 32.
        arquivo4.Exibir();  // Saída: Exibindo arquivo: Foto.jpg. Exibindo ícone Imagem com tamanho 32.
    }
}


Enter fullscreen mode Exit fullscreen mode

Explicação do Código:

No exemplo, a classe IconeArquivo representa um ícone que é compartilhado entre diferentes arquivos do mesmo tipo. A IconeFactory gerencia esses ícones e garante que cada tipo de arquivo (PDF, Word, Imagem) tenha apenas um ícone carregado na memória. Quando um arquivo é criado, ele obtém o ícone apropriado da fábrica e reutiliza o ícone existente, se já estiver carregado.

Conclusão:

O padrão Flyweight é útil em cenários onde você tem muitos objetos semelhantes que podem compartilhar dados comuns, como ícones de arquivos. Ele ajuda a economizar memória ao evitar a criação de várias instâncias do mesmo ícone, tornando o sistema mais eficiente.

Código fonte: GitHub

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player