SINGLETON ... o que significa?

14 respostas
E

Pessoal estou com uma dúvida…

O que é e para que serve o SINGLETON??

um abraço!!!

14 Respostas

B

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!

S

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”

A

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:
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
}
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:
Singleton.getInstance();

Obs: peguei o exemplo daqui -> [url]http://www.javafree.org/wiki/Singleton[/url]

A

Vale ressaltar que o Singleton é considerado um anti-pattern (especialmente quando você usa ele em demasia).

F

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.

E

valeu galera!!

T

Se alguém fosse fascinado por cinema aqui, indicaria outro Singleton:

John Singleton

F

thingol:
Se alguém fosse fascinado por cinema aqui, indicaria outro Singleton:

John Singleton

haoiehaoeihaeoihaeoi xD

Boa :wink:

T

Só completando o singleton PODE ser considerado um anti-pattern especialmente se usado em demasia.
É comumente utilizado para armazenar variáveis globais.

A

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);
    }

    ;
}
J

Aqui tem um artigo muito interessante sobre Singleton:
http://javafree.uol.com.br/artigo/877162/Entendendo-o-pattern-Singleton.html

Espero ter ajudado.

M

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

M

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.

L

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.

Criado 24 de julho de 2009
Ultima resposta 18 de mai. de 2010
Respostas 14
Participantes 12