|
||
|
|
| Conheça o Plugfeed | » Início » Programação » Java » Padrões de Projeto: Singleton --> |
|
Avaliação:
![]() ![]() ![]() ![]() | Publicado em: 24/03/2008Padrões de Projeto: Singleton
Mauricio Aniche Bacharel em Ciência da Computação pela Universidade Presbiteriana Mackenzie, trabalha há 5 anos com desenvolvimento de websites, utilizando tecnologias como C# e Java. Grande fã de orientação à objetos, padrões de projeto e banco de dados.
Padrões de Projeto: Singleton
Olá pessoal! Esse é o meu primeiro artigo pelo Plugmasters e espero que gostem! Meu objetivo é iniciar uma pequena série sobre os tão famosos padrões de projeto (ou Design Patterns). Mas o que são padrões de projeto? Padrões de projeto são soluções para alguns problemas que geralmente ocorrem em projetos. Não são códigos prontos que irão resolver imediatamente o seu problema, mas sim um modelo que pode ser usado em diversas situações. Os exemplos aqui serão feitos em C#, mas podem ser facilmente convertidas para Java. Hoje irei tratar do Singleton. O singleton é um padrão criacional, ou seja, ele trata da criação de objetos. Através dele, garantimos que apenas uma única instância do objeto seja instanciada em todo o projeto. Qual a funcionalidade disso? Simples, objetos que tratam de pools de conexão, saídas gráficas, impressão, objetos que cuidam de registros ou de logs não devem ser instanciados mais de uma vez! Já imaginou instanciar dois objetos que lidam com a impressora ao mesmo tempo? Isso iria gerar muitos problemas! Alguns programadores devem estar pensando agora: Mas isso é fácil! Basta eu ter uma variável global com a instância do objeto e sempre acessar ela! O problema é que essa variável sendo inicializada no começo da execução do projeto, essa classe estará consumindo recursos mesmo sem ser utilizada! Com o Singleton, a classe só é instanciada quando você realmente precisa dela! Mas como previnir que um objeto não seja instanciado mais de uma vez? A solução é simples! Muitos desconhecem, mas é possível criar um construtor privado! Com isso, a classe só pode ser instanciada dentro de algum dos seus próprios métodos! public class Singleton { private Singleton () { } } Agora que só podemos instanciar a classe dentro de um método, vamos fazer com que esse método nos garanta que apenas uma classe seja inicializada. Para isso vamos ter uma variável estática que guardará a instância do único objeto instanciado. Caso ela esteja nula, a função irá instanciar o objeto e então retorná-lo para o usuário. Caso ela já contenha uma instância, o método apenas retorna o objeto. Em código, temos: public class Singleton { private static Singleton instancia = null; private Singleton () { } public static Singleton getInstance() { if(instancia==null) instancia = new Singleton (); return instancia; } } Pronto! Nossa classe agora é um Singleton! Não é possível ter mais de uma instância desse objeto! Como se faz para instanciar um objeto já que não posso simplesmente dar um “new” nele? Singleton c1 = Singleton.getInstance(); Singleton c2 = Singleton.getInstance(); Em nosso exemplo, c1 e c2 representam o mesmo objeto! No próximo artigo, pretendo tratar de Abstract Factory, um outro padrão também criacional, e iremos utilizar o Singleton para garantir que haja apenas uma instância da fábrica! Até a próxima! Referências Bibliográficas: FREEMAN E.; FREEMAN. E; SIERRA, K.; BATES B. Head First: Design Patterns. Sebastopol: O’Reilly, 2001. Links relacionados
Samuel Troina <vtman@terra.com.br>
Muito bom utilizar isso para garantir uma unica instancia de um objeto em um script sugiro utilizar a segunda opcao devido ao fato de ela ser compativel tanto para a versoes >= 4
class Singleton { function Singleton () { } function &getInstance() { static instancia = null; if (instancia === null) instancia = new Singleton (); return instancia; } } Ex.: objSingleton = &Singleton::getInstance(); ![]() ![]() ![]() ![]() ![]() Leonardo Amêndola <leonardoamendola@gmail.com>
Parabéns Maurico, pelo artigo, adotei esse padrão e gostei muito.
Abraço ![]() ![]() ![]() ![]() ![]() Michel <michellopes.tsi@gmail.com>
Para uma aplicação Web isso não se tornaria um problema? Exemplo digamos que mais de um usuário esteja acessando minha aplicação e eu estivesse por exemplo utilizando isso para istanciar a conexão com o banco de dados, sendo assim todos os meus usuário usariam a mesma conexão, não ficaria lento por exemplo?
![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
|
|