Um bom exemplo de Singleton

queria aplicar o modelo do singleton nesse codigo aqui que faz conexão com um banco de dados acess!!

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Adauto
 */
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package massa;

import java.sql.*;
import javax.swing.*;

/**
 *

 */
public class clsBancoDeDados {

    static Connection conexao;
    static Statement comando;
    static ResultSet rs;
    //ALUNOS
    static Integer codaluno;
    static Integer codmodalidade;
    static Integer codpromocao;
    /*static String nomealuno;
    static Date datanasc;
    static String profissao;
    static String endereco;
    static String nro;
    static String apto;
    static String bairro;
    static String telefone;
    static String celular;*/

    public static void main(String args[]) throws InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {

        try {
            //PARA COLOCAR O FORMATO WINDOWS
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                //Para Setar as opções Yes=Sim e No=Não
                UIManager.put("OptionPane.yesButtonText", "Sim");
                UIManager.put("OptionPane.noButtonText", "Não");
            } catch (ClassNotFoundException classNotFoundException) {
            } catch (InstantiationException instantiationException) {
            } catch (IllegalAccessException illegalAccessException) {
            } catch (UnsupportedLookAndFeelException unsupportedLookAndFeelException) {
            }

            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            conexao = DriverManager.getConnection("jdbc:odbc:bdEngenharia");
            comando = conexao.createStatement();
            //testa danco
            rs = comando.executeQuery("select * from login");
            while (rs.next()) {
                System.out.println(rs.getString("usuario"));
                System.out.println(rs.getString("senha"));
                System.out.println(rs.getString("permissao"));
            }
            // rs = comando.executeQuery("select * from dados");
            //while (rs.next()) {
            //System.out.println(rs.getString("nome"));
            //System.out.println(rs.getString("dados"));
            //}
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(null,
                    "Erro de Conexao com Banco de Dados" + e);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,
                    "Erro de Sintaxe SQL" + e);
        }
        frmLogin login = new frmLogin();
        login.setVisible(true);
    }

    ;
}

Olhem também

http://javafree.uol.com.br/topic-852515-Implementando-o-singleton.html

Segue um exemplo de uma classe com singleton e a mesma classe sem o uso do padrão de projeto singleton

obs: esse trecho de código faz parte de um projeto open source de replicação de dados entre banco de dados postgres que desenvolvo

package net.com.repliengine;

import java.sql.*;

/**
 *
 * @author thiago luiz rodrigues
*  exemplo de classe com o uso de singleton
 */
public class Conect {

  private static Configure configure = null;
  private static Connection con = null;

  public Conect(Configure configure) {
      if (this.configure == null) {
            this.configure = configure;
      }
  }

  public Connection getConection() {
       if (con == null) {
          try {
              Class.forName("org.postgresql.Driver");
              try {
                con = (Connection)DriverManager.getConnection("jdbc:postgresql://" + configure.getlocal() +":5432/" + configure.getbanco(),configure.getlogin(), configure.getsenha());
              } catch(SQLException e) {
                throw new AbstractMethodError(e.getMessage());
              }
          } catch(ClassNotFoundException e) {
              System.out.println(e.getMessage());
          }
       }
       return con;
  }
}

Agora um exemplo da mesma class sem o padrão singleton

[code]package net.com.repliengine;

import java.sql.*;

/**
*

  • @author thiago
  • sem o uso de singleton
    */
    public class Conect {

private Configure configure;
private Connection con;

public Conect(Configure configure) {
this.configure = configure;
}

public Connection getConection() {
try {
Class.forName(“org.postgresql.Driver”);
try {
con = (Connection)DriverManager.getConnection(“jdbc:postgresql://” + configure.getlocal() +":5432/" + configure.getbanco(),configure.getlogin(), configure.getsenha());
} catch(SQLException e) {
throw new AbstractMethodError(e.getMessage());
}
} catch(ClassNotFoundException e) {
System.out.println(e.getMessage());
}

   return con;

}
}[/code]

Agora um exemplo de chamada

        IniFiles ini = new IniFiles(file);
        String local = ini.getString("masterdb", "local");
        String login = ini.getString("masterdb", "login");
        String senha = ini.getString("masterdb", "senha");
        String banco = ini.getString("masterdb", "banco");

        Configure configure = new Configure();
        configure.setbanco(banco);
        configure.setlocal(local);
        configure.setlogin(login);
        configure.setsenha(senha);
        configure.setsgdb("pgsql");
        /*
        observe esse trecho se estiver usando singleton será a mesma conexão
        se não serão duas conexões
        */
        Connection conection = new Conect(configure).getConection();
        Connection conection1 = new Conect(configure).getConection();
        
        //new ThreadMinimizar(file, conection, configure, ini).start();
        new ThreadReplicar(file, conection, configure, ini).start();
        new ThreadPendencias(file, conection, configure, ini).start();

É impressão minha ou o discorpio ressuscitou ou tópico de 3 anos por motivos evangélicos, e ele deu quase 2 páginas de caldo? E o mais engraçado, são as séries de ressurreições subsequentes.

Usar Singleton pra manter uma conexão aberta é um dos piores exemplos de Singleton. Isso sim é um antipattern. Não só mantém um recurso aberto para sempre, como não dá tratamento para caso a conexão feche do lado do servidor, e simplesmente impede que o trecho de BD seja usado por múltiplas threads.

Outra coisa, muita gente gosta do Singleton com “lazy creation”. Além de deixar o código mais rebuscado desnecessariamente, também o torna menos thread-safe.

[joke mode]
Como assim Deus é um singleton? E o esquema da Santissima trindade?

Deus implementa Três Interfaces (Pai, Filho e Espírito Santo)?
As outras entidades (Filho e Espírito Santo) implementam uma indireção com Deus?
Deus é uma superclasse? Ou é a própria JVM?]
Deus me perdoará por este post?
[/joke mode]

[/quote]

kkkkkkkkkkk… desculpe galera, mas foi muito engraçado.

Pense em aplicações com vários ClassLoader´s e entenderá o motivo da má usabilidade e da associação com anti-pattern.

Out of context:

Isso não depende do ponto de vista? Rsrsrs
Se eu deitar embaixo da cascata, do meu ponto de vista, a água cai pra cima!
:smiley: :twisted: :twisted: