Design Pattern Singleton

10 respostas
A

Ae pessoal gostaria de saber se alguem tem algum tutorial sobre esse design pattern pois apenas o que sei sobre ele … eh a ex: a classe DATAFORMAT tem esse modelo!! pois nao posso chamar o construtor dela… eu tenho que pegar uma instancia !! pq isso!!!

flww!!

10 Respostas

aleck

http://pt.wikipedia.org/wiki/Singleton

[]'s

bcartaxo

O padrão de projeto Singleton existe para ser aplicado qd se deseja q exista apenas uma instância da classe. Esse padrão é implementando de forma q a própria classe fica responsável por instanciar e oferecer a única instancia dela mesma, através de um construtor privado (eis a razão pela qual vc n consegue instanciar a classe q vc deseja chamndo o constutor, ele é privado, sua classe n vai enxergar o construtor dele)

Segue a implementação básica de um Singleton:

public class Singleton {

	private static Singleton instance = null;
	
	private Singleton(){}
	
	public static Singleton getInstance(){
		if (instance == null){
			instance = new Singleton();
		}
		
		return instance;
	}
	
}

Sempre q vc precisar de um método de uma classe q implementa o pattern Singleton, chame o método static para obter a instancia da classe e através dessa chamada chame o método desejado.
É basicamente isso.

ViniGodoy

Algumas peculiaridades desse padrão no Java:

  1. Uma vez criado, há poucas chances de um singleton ser destruído. Normalmente, o objeto só vai morrer ao final de seu programa ou se implementar algo com weak references;
  2. Vários class loaders ou aplicações que rodem em mais de um VM podem ter mais de um singleton. Tome cuidado com isso;
  3. Pode ser substituido por depency injection quase sempre;
  4. Em aplicações multi-threads, o singleton deve ser sincronizado, ou corre-se o risco de criar várias instâncias.
A

E pq eu iria querer ter apenas uma instancia da classe… e como isso é possivel??? pq nunca vou ter a chamada NEW ??

bcartaxo

Kra… qd vc começar a desenvolver aplicações maiores e divididas em camadas vc vai enxergar q existem inúmeros situações q só se deseja ter uma instância de um determinado objeto. Repositórios são muitas vezes implementados usando Singleton, bem… padrões de projeto é uma coisa de OO n de java especificamente, se vc quiser saber mais sobre Padrões de Projeto, busque no google e na wikipedia sobre Design Patterns do gof pra começar.

Qt ao NEW… Sim, vc nunca vai dar new numca classe q implementa o Pattern Singleton (a menos q vc implemente o Singleton), se vc só está usando uma classe q implementa vc simplesmente chama o método para obter a instancia dessa classe e pronto, vc tem acesso ao objeto (único) da classe, e pode chamar os métodos q quiser.

ViniGodoy

Você terá uma única chamada a new, que ficará na parte interna da classe do seu Singleton.

Há muita discussão sobre se é ou não correto o uso de singletons.

O principal uso é gerenciar recursos limitados. O colega deu um exemplo: geralmente as aplicações possuem um (e apenas um) repositório de dados. Ou então, se você desenvolver uma classe que gerencia a placa de som, não vai querer várias instancias dela por aí (pois você geralmente só tem um hardware de som).

Existem pessoas que usam o Singleton como um repositório de constantes globais. Ok, embora você certamente possa fazer isso, não significa que você deva. Constantes globais são um problema e disfarça-las de Singleton não vai te ajudar em nada.

No C++, os singletons ainda tem outra característica interessante. Como não precisamos passar a referência de um singleton nos construtores, métodos e não precisamos guarda-lo em nenhum atributo, também não precisamos importa-lo no .h. Seu uso (e importação) fica restrito somente no .cpp. Isso permite ao compilador perder muito menos tempo em recompilações caso a classe do Singleton seja alterada.

Devido a algumas características da linguagem Java (na verdade, de todas as linguagens com Garbage Collection ou que rodem de maneira distribuída), o Singleton é largamente substituído por Depency Injection.

jamesfrj

Pessoal sou novo em Java e estava com uma dúvida neste Design Pattern Singleton. Resolvi testar o Singleton com base no código criado pelo colega bcartaxo:

final class FabricaDeCarro{
	private static FabricaDeCarro instance = null;
	
	public static FabricaDeCarro getInstancia(){
		if(instance == null){
			instance = new FabricaDeCarro();
		}
		return instance;
	}
	
	private FabricaDeCarro(){}

}

Criei uma classe para teste, dessa forma:

class TestaFabricaDeCarro{
	public static void main(String[] args){
		FabricaDeCarro fc1 = FabricaDeCarro.getInstancia();
		System.out.println("Instancia fc1 criada!");
		
		// Esta linha não deveria ocasionar um erro?
		FabricaDeCarro fc2 = FabricaDeCarro.getInstancia();
		System.out.println("Instancia fc2 criada!");
	}
}

Não entendo porque ele deixa criar o objeto fc2, pois se já instanciei através de fc1 eu não poderia, certo?

gilmaslima

Na verdade tanto a variavel fc2 quanto fc1 apontam para o mesmo objeto em memória.

Faça um testa assim:

Coloque atributos em no objeto instance e altere na primeira variavel (fc1) e depois veja se alterou na variavel fc2

flw!

ViniGodoy

O Singleton significa que só vai existir um objeto (e realmente, no código só foi dado new uma única vez, quando a primeira chamada entrou no if), mas não diz nada sobre quantas referências esse objeto pode ter.

O código do bcartaxo, apesar de ser uma implementação comum, tem um problema. Não é thread-safe.

O código correto seria:

public class Singleton {
	private static Singleton instance = new Singleton();
	
	private Singleton(){}
	
	public static Singleton getInstance(){
		return instance;
	}	
}

Outra possibilidade, se quiser manter o lazy-loading:

public class Singleton {  
      
        private static Singleton instance = null;  
          
        private Singleton(){}  
          
        public static synchronized Singleton getInstance(){  
            if (instance == null){  
                instance = new Singleton();  
            }  
              
            return instance;  
        }            
    }

Negligenciar thread-safety pode fazer com que seu Singleton deixe de ser um Singleton.

jamesfrj

Obrigado aos colegas ViniGodoy e gilmaslima.

Criado 10 de maio de 2007
Ultima resposta 17 de jan. de 2012
Respostas 10
Participantes 6