Um bom exemplo de Singleton

SessionFactory eh bem melhor injetado do que como Singleton (ou testar vira um inferno).

deus é um bom exemplo se for em um aplicativo católico, se for um aplicativo celta ou egípcio ja mia… :stuck_out_tongue:

[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]

Comentário perfeito!

Galera eu estou aprendendo Java, e pelo menos acho que ja estou bom nos fundamentos e agora começei a ler sobre Singleton e estava tentando reestruturar uma classe que eu tinha de conexão com o DB, mas estou tendo alguma dificuldades bobas e precisava de alguma ajuda.
O que eu devo mudar pra deixar esta classe dentro do padrão (ou melhor forma)

[code]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**

  • Classe Singleton responsável pela conexão com o Bando de Dados Oracle 9i

  • utilizando driver 9.0.2
    */
    public class ConexaoDB {

    private static Connection conn = null;

    private static String user;

    private static String password;

    private static String db;

    private static String port;

    private static String IP;

    /**

    */
    private ConexaoDB() {
    try {
    Class.forName(“oracle.jdbc.OracleDriver”);
    conn = DriverManager.getConnection(“jdbc:oracle:thin:” + user + “/”
    + password + “@” + IP + “:” + port + “:” + db);

     } catch (SQLException sqle) {
     	sqle.printStackTrace();
     } catch (ClassNotFoundException cnfe) {
     	cnfe.printStackTrace();
     } // try
    

    }

    public synchronized static Connection getInstance() {
    if (conn == null) {
    conn = new ConexaoDB();
    }
    return conn;
    }
    }[/code]
    o método getInstance não está legal estou com problemas de como resolver ele

Obs: se for possivel (não quero abusar) se pudessem postar explicações aqui msm ou em algum outro tópico do GUJ, pois não tenho acesso em nenhum outro site.

Obrigado pela ajuda galera

Ok, seu método getInstance retorna um objeto do tipo Connection. Sua variável também é do tipo Connection, então, como você espera dar um new ConexaoDB() nela?

Então vamos lá. O primeiro passo para o seu singleton é remover todos os atributos estáticos. Se você terá somente uma instância dessa classe, pode usar os atributos dessa instância.

Projete a classe normalmente, como se ela não fosse um singleton, depois:

  1. Deixe o seu construtor privado;
  2. Crie o atributo estático para a instância única da sua classe;
  3. Crie o método estático para obter essa instância.

No seu caso, acho que a classe ficaria mais ou menos assim:

[code]
public class ConexaoDB {
private static ConexaoDB myInstance = null;

private Connection conn = null;
private String user;
private String password;
private String db;
private String port;
private static String IP;

private ConexaoDB() {
try {
Class.forName(“oracle.jdbc.OracleDriver”);
conn = DriverManager.getConnection(“jdbc:oracle:thin:” + user + “/” + password + “@” + IP + “:” + port + “:” + db);
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} // try
}

public synchronized static ConexaoDB getInstance() {
if (conn == null) {
conn = new ConexaoDB();
}
return conn;
}

//Demais getters
}[/code]

O uso da classe fica simplesmente:

if (ConexaoDB.getInstance().getUser.equals("XYZ")) {
   Connection conn = ConexaoDB.getInstace().getConnection();
   //....
}
...

Só lembre-se que o singleton uma vez criado, não será mais removido de seu programa. Preste especial cuidado para recursos que ficam abertos e precisam de tratamento especial para serem fechados, como é o caso de uma Connection.

Desculpa a incapacitação de compreenção, mas ta treta entender. Estou pensando assim, mas é certeza que isso ta errado ta com cheiro de gambiarra.
Poderiam demostrar uma classe de controle a Bando de Dados pra eu poder me basear legal, mas ainda vou mandar a minha pra vcs darem uma criticada legal ai como ajuda.

Vw Galera

[code]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConexaoDB {

private static ConexaoDB myInstance = null;

private Connection conn = null;

private String user;

private String password;

private String db;

private int port;

private static String IP;

private ConexaoDB() {
	try {
		Class.forName("oracle.jdbc.OracleDriver");
		conn = DriverManager.getConnection("jdbc:oracle:thin:" + user + "/"
				+ password + "@" + IP + ":" + port + ":" + db);
	} catch (SQLException sqle) {
		sqle.printStackTrace();
	} catch (ClassNotFoundException cnfe) {
		cnfe.printStackTrace();
	} // try
}

public synchronized static ConexaoDB getInstance() {
	if (myInstance == null) {
		myInstance = new ConexaoDB();
	}
	return myInstance;
}

private Connection getConn() {
	if (conn == null) {
		getInstance();
	} // if
	return conn;
}

private synchronized void setDeath() {
	myInstance = null;
}

}[/code]

O método setDeath dessa forma pode fazer o seu Singleton deixar de ser singleton!

Outra coisa, qual é a idéia por trás de tantos métodos synchronized? Se for manter o seu código thread-safe, não está indo por um bom caminho, já que você vai retornar a mesma conexão para várias threads. O ideal seria criar uma conexão por thread, usando um thread local, ou criar um Pool de conexões. Como isso não é tarefa das mais fáceis, você pode pegar um pool pronto, como do projeto Jakarta DBCP.

Blz, quando chegar em casa do uma olhada, pois aqui é tudo bloqueado.
Mas blz, vo tentar estudar mais alguma outra coisa.

Vlww 8)

Tenho que fazer um projeto pra faculdade usando o padrão singleton.
Mais não sei qual aplicação??? Preciso de uma idéia para fazer o programa…
Vlw
:idea:

Bom dia a todos.

[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]

Já dizia Lavosier que DEUS é o Perfeito Filósofo, Químico, Físico, Astrônomo, Matemático, …enfim, até em outras Ciências desconhecidas do homem. Portanto DEUS não é uma Superclasse, DEUS não é um programa, além de DEUS ser o nosso Pai, ele também é o Pai da Ciência.

Só por esta razão, de DEUS ser também o nosso Pai, acredito que Ele te perdoará, assim como já me perdoou várias vezes.

Contudo, como aqui não é o espaço para falar de religião, voltemos ao foco, e vamos falar sobre Singleton e Hibernate, gostaria de aprender sobre o assunto.

Um bom exemplo de Singleton?

System.out

System.err

Procure no javadoc por Runtime e Desktop. São dois singletons.

Mais sobre singleton verdadeiros aqui

[quote=peczenyj]Um bom exemplo de Singleton?

System.out

System.err[/quote]

Isso não são singletons, são atributos estáticos. Vc pode mudá-los com setIn e setOut; (Ver javadoc)
System em si é um exemplo de Registry, não de singleton.

Posso mudar o ‘out’ globalmente? WOW!

Como vc achava que o eclipse consegue mostar numa janela de SWT o que o seu programa escreve no system.out ? :wink: Magia ? :lol:

Ora, redirecionar a stdout não é misterio para quem conhece unix pipes :wink:

[quote=osmio]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!
[/quote]

Não depende do ponto de vista. Já que nessa posição invertida vc não consegue fazer a água cair para baixo :slight_smile:
(Isto estuda-se na fisica como a Segunda Lei da Termodinamica acoplada ao conceito de Referencial Mecânico)
Ou seja, sempre apenas um dos processo é possivel mas não inverso. E essa é a essência da frase.

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