DEV Community

Juarez Júnior
Juarez Júnior

Posted on

C# Design Pattern: ObjectPool (Portugues)

O padrão Object Pool é usado para gerenciar a reutilização de objetos caros ou demorados de serem criados. Em vez de criar e destruir instâncias repetidamente, o Object Pool mantém um conjunto de objetos prontos para serem reutilizados, o que melhora a eficiência do sistema, especialmente quando a criação de novos objetos é custosa em termos de tempo ou recursos. Um exemplo comum de uso do Object Pool seria em sistemas de conexão com banco de dados ou em renderizadores gráficos.

Exemplo de Código em C#:

// Classe de exemplo que será gerenciada pelo Object Pool
public class Conexao
{
    public string Id { get; set; }

    public Conexao(string id)
    {
        Id = id;
        Console.WriteLine($"Conexão {Id} criada.");
    }

    public void Conectar()
    {
        Console.WriteLine($"Conexão {Id} conectada.");
    }

    public void Desconectar()
    {
        Console.WriteLine($"Conexão {Id} desconectada.");
    }
}

// Classe Object Pool para gerenciar as conexões
public class ConexaoPool
{
    private List<Conexao> _disponiveis = new List<Conexao>();
    private List<Conexao> _emUso = new List<Conexao>();

    public Conexao ObterConexao()
    {
        Conexao conexao;

        if (_disponiveis.Count > 0)
        {
            conexao = _disponiveis[0];
            _disponiveis.RemoveAt(0);
            Console.WriteLine($"Conexão {conexao.Id} reutilizada.");
        }
        else
        {
            conexao = new Conexao(Guid.NewGuid().ToString());
        }

        _emUso.Add(conexao);
        return conexao;
    }

    public void LiberarConexao(Conexao conexao)
    {
        _emUso.Remove(conexao);
        _disponiveis.Add(conexao);
        Console.WriteLine($"Conexão {conexao.Id} liberada e retornada ao pool.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ConexaoPool pool = new ConexaoPool();

        // Obter e usar conexões
        Conexao conexao1 = pool.ObterConexao();
        conexao1.Conectar();

        Conexao conexao2 = pool.ObterConexao();
        conexao2.Conectar();

        // Liberar conexões de volta ao pool
        conexao1.Desconectar();
        pool.LiberarConexao(conexao1);

        Conexao conexao3 = pool.ObterConexao();  // Reutilizando conexão liberada
        conexao3.Conectar();

        conexao2.Desconectar();
        pool.LiberarConexao(conexao2);
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação do Código:

Neste exemplo, a classe Conexao representa um objeto custoso (por exemplo, uma conexão de banco de dados). O ConexaoPool gerencia essas conexões, mantendo duas listas: uma para conexões disponíveis e outra para conexões em uso. O método ObterConexao reutiliza uma conexão da lista de disponíveis, se houver, ou cria uma nova se necessário. O método LiberarConexao devolve a conexão para o pool para que possa ser reutilizada.

Conclusão:

O padrão Object Pool é eficaz para gerenciar recursos caros e limitar a criação de novos objetos, promovendo a reutilização. Isso pode ser essencial em sistemas de alta performance que exigem gerenciamento eficiente de recursos, como conexões de banco de dados, threads, ou buffers de memória.

Código fonte: GitHub

Top comments (0)