Simplificando o seu código: Entendendo o padrão Singleton em Java

Por Gaspar Barancelli Junior em 06 de março de 2023

O padrão Singleton é um dos padrões de projeto mais populares e úteis em Java. Ele garante que uma classe tenha apenas uma instância em todo o programa e fornece um ponto de acesso global a essa instância. Neste post, vamos explorar como implementar o padrão Singleton em Java, juntamente com alguns exemplos de código.

Exemplo de implementação em Java

Digamos que estamos criando um aplicativo Java que precisa acessar um banco de dados. Para fazer isso, precisamos estabelecer uma conexão com o banco de dados, que é um processo potencialmente caro em termos de recursos do sistema. Nós não queremos criar uma nova conexão sempre que precisarmos acessar o banco de dados, mas também não queremos que várias conexões sejam criadas ao mesmo tempo.

Para resolver esse problema, podemos usar o padrão Singleton. Podemos criar uma classe DatabaseConnection que representa uma conexão com o banco de dados e garantir que apenas uma instância desta classe seja criada em todo o aplicativo. Isso é especialmente útil em aplicativos de grande escala, onde a criação de várias conexões de banco de dados pode afetar significativamente o desempenho do sistema.

public class DatabaseConnection {
    private static DatabaseConnection instance;
    private Connection connection;

    private DatabaseConnection() throws SQLException {
        connection = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "root", "password");
    }

    public static synchronized DatabaseConnection getInstance() throws SQLException {
        if (instance == null) {
            instance = new DatabaseConnection();
        }
        return instance;
    }

    public Connection getConnection() {
        return connection;
    }
}

Neste exemplo, temos uma classe DatabaseConnection que possui uma instância privada e estática da própria classe e um objeto de conexão. O construtor é privado, portanto, nenhuma outra instância da classe pode ser criada a partir do código cliente.

Em vez disso, criamos um método público estático chamado getInstance que retorna a única instância existente da classe. Este método usa uma verificação de nulidade para garantir que uma nova instância da classe seja criada apenas se ainda não existir uma instância.

Finalmente, temos um método público chamado getConnection que retorna a conexão com o banco de dados.

Podemos então usar a classe DatabaseConnection para acessar o banco de dados em nosso código cliente, como no exemplo abaixo:

public class Main {
    public static void main(String[] args) throws SQLException {
        DatabaseConnection connection = DatabaseConnection.getInstance();
        Connection dbConnection = connection.getConnection();
        // Use a conexão para acessar o banco de dados
    }
}

Neste exemplo, usamos o método getInstance para obter uma instância única da classe DatabaseConnection e, em seguida, chamamos o método getConnection para obter uma conexão com o banco de dados. A partir daqui, podemos usar a conexão para acessar o banco de dados, como fazer consultas ou atualizações.

Conclusão

O padrão Singleton é uma maneira eficaz de garantir que uma classe tenha apenas uma instância em todo o programa e fornecer um ponto de acesso global a essa instância. Em Java, podemos implementar o Singleton de várias maneiras, mas a mais comum é por meio de uma variável estática privada e um método estático público que retorna a única instância. Este padrão é amplamente utilizado em várias aplicações Java e pode ser especialmente útil em situações em que precisamos garantir a coerência de dados em todo o programa.

// Livros recomendados relacionados ao assunto do post

// Compartilhe esse Post