Pessoal estou com uma dúvida…
O que é e para que serve o SINGLETON??
um abraço!!!
Pessoal estou com uma dúvida…
O que é e para que serve o SINGLETON??
um abraço!!!
Já tentou o google?
Não é por nada não mas tem certas coisas que vc encontra mais detalhado na rede.
[]`s e não deixe de postar no fórum as suas dúvidas vlw!
Posso estar errado mais ai vai…
Um Singleton serve para instacionar uma Classe para toda uma aplicação. Por exemplo um conexao usando singleton, todos os usuários usam a mesma instancia de conexao para a aplicação.
“Tem o objetivo garantir que existe apenas uma instancia de uma certa classe a qualquer instante e em qualquer ponto de um sistema”
Singleton é uma Design Pattern (ou padrão de projeto em português). Em OO existem alguns problemas/situações pelas quais a maioria dos programadores passam ou vão passar, por exemplo, as vezes é conveniente que exista apenas uma instância de um determinada classe que vai ser utilizada em toda a aplicação (isso pode ocorrer por uma série de razões, porque o objeto consome muitos recursos de sistema ou para centralizar as informações contidas no objeto etc) para esse problema (que talvez você já até tenha passado) existe a Design Pattern Singleton, que nada mais é que um tipo de construção utilizada para garantir que exista somente uma instância de uma determinada classe.
Exemplo:
[code]
public final class Singleton {
private static Singleton me = new Singleton();
private Singleton(){} // construtor privado, impede que seja instânciado fora da própria classe
public static Singleton getInstance(){
return me;
}
//métodos do objeto
} [/code]
Dessa forma (e com a ajuda do construtor privado que não permite ninguém criar uma instância de singleton diretamente) só é possível acessar a instância da classe através de:
Obs: peguei o exemplo daqui -> http://www.javafree.org/wiki/Singleton
Vale ressaltar que o Singleton é considerado um anti-pattern (especialmente quando você usa ele em demasia).
O singleton deve ser usado com moderação e inteligência!
Seu uso tem que ser bastante pensado e planejado. Geralmente, não faz muito sentido ter apenas uma instância de uma determinada classe em um software.
valeu galera!!
[quote=thingol]Se alguém fosse fascinado por cinema aqui, indicaria outro Singleton:
John Singleton
[/quote]
haoiehaoeihaeoihaeoi xD
Boa
Só completando o singleton PODE ser considerado um anti-pattern especialmente se usado em demasia.
É comumente utilizado para armazenar variáveis globais.
Alguém poderia me ajudar a aplicar o singleton nesse codigo de conexão com uma banco acess, ou me passar um exemplo proprio onde tenha usado o singleton?
/*
* 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);
}
;
}
Aqui tem um artigo muito interessante sobre Singleton:
http://javafree.uol.com.br/artigo/877162/Entendendo-o-pattern-Singleton.html
Espero ter ajudado.
Acho que o grande problema do Singleton é esse famoso “.getInstance()”.
Quando se faz algo assim:
public void algumaCoisa() {
MeuSingleton.getInstance().fazAlgo();
}
Sua classe fica com um acoplamento muito grande com MeuSingleton. Agora aplica testes unitários nisso ae: Se um teste alterar o estado do seu singleton, outro teste vai enxergar isso. Resultado: Um teste depende do outro. Pra resolver, no mínimo vais ter que fazer algumas gambiarras.
Quando uso singletons, eu recebo a instancia dele via injeção de dependencias: Como parametro no próprio método ou no construtor da classe. E então deixo o container de DI (Em Delphi fui obrigado a implementar o meu) gerenciar a instancia do singleton.
Postei no meu blog um pouco das ideias que tenho sobre isso: http://blog.magnomachado.com.br/?p=8
Um exemplo onde eu acho que o singleton se encaixa bem (quem quiser discordar fique à vontade, eu ainda tenho mt o que aprender em orientação a objetos)
Em Delphi, trabalho em um sistema que precisa se comunicar com impressoras fiscais (ECF).
Então tenho uma interface chamada IEcf, e várias implementações para cada fabricante/modelo de ecf (TEcfDaruma, TEcfBematech, etc).
Seja lá qual for a impressora que o cliente usar, o sistema vai instanciar a classe correspondente e usará essa instancia durante toda a execução do sistema.
Mas todos os métodos que precisam se comunicar com a impressora recebem o IEcf via parâmetro do método ou no construtor da classe. Eu não tenho uma variável ou função global onde todo mundo vai quando precisa da impressora.
Acredito que o Singleton também fica bem colocado quando estamos desenvolvendo alguma aplicação que utilize várias janelas. Com a utilização do singleton podemos determinar que uma detarminada janela, ex. “cadastrar cliente”, possa ser aberta apenas uma vez.
Não sei se há outros métodos de limitar o número de abertura da janela, acredito que haja, mas achei bacana e simples fazer isso usando o singleton.
Abs.