Singleton

Este texto foi atualizado e doado ao projeto Code Design World.
Leia a versão mais atualizada.

Singleton

Objectivo

Restringir a instanciação de objetos de um certa classe a um único objeto e encapsular essa criação na própria classe.

Discussão

Singleton é um dos padrões mais incompreendidos de sempre. O objetivo não é simplesmente limitar o numero de objetos que podem ser criados. Isso poderia ser feito com uma implementação especial de Factory. O objetivo é que só seja possivel criar um e nunca mais do que um. Isso uma implementação de factory não poderia fazer pois bastaria criar uma factory diferente que criasse mais do que um.

A classe tem que garantir que só possa ser instanciada uma única vez. Isto significa que a classe deve conter um Factory Method estático que possa controlar a instanciação do objeto internamente. Este método estático torna, automáticamente, o Singleton num objeto global. Isso é meia verdade pois esse método não tem que ser publico, basta que tenha nivel de pacote para que possa ser usado por outra classe do mesmo pacote como uma implementação de Factory. Assim, não ha como criar outra Factory que crie mais do que um objeto da classe.

A necessidade de usar um Singleton nasce da necessidade de controlar recursos de forma economica. Por exemplo, impedir que um recurso seja acessado de vários pontos diferentes do sistema para evitar memory leak ou resource locking. É especialmente necessário ao trabalhar com recursos de harware em que apenas uma máquina está disponivel para uso por um ou mais sistemas. Esta necessidade é na realdiade rara, já que acessos a hardware são embutidos na JVM ou via JNI.

Um dos perigos de implementar Singleton é segurança relativa a threads. Já que só existe uma instancia do objeto o acesso a ele tem que ser thread-safe. Se ainda por cima a instanciação do objeto usa o padrão de Lazy Loading a própria criação tem que ser thread-safe.

Implementação

Ao implementar um Singleton é necessário saber se precisamos de thread-safety e se o acesso pode ser global e directo ou se precisa passar por um Factory. Se precisarmos de usar Factory basta aplicar visibilidade de pacote ao método estático de instanciação e criar uma classe de fabrica no mesmo pacote. Iremos usar a classe Deus como exemplo para criação de um singleton.

01
02 /**
03 * Um Singleton não serve para ser extendido.
04 */
05 public final class Desktop {
06
07 private static Desktop me = new Desktop () ;
08
09 /**
10 * O construtor tem que ser privado
11 */
12 private Desktop (){}
13
14 /**
15 *Método de instanciação. Uma aplicação estática do padrão Factory Method
16 */
17 public static final Desktop getInstance () {
18 return me;
19 }
20
21 // metodos da classe
22 …
23 }
24 Implementação simples de Singleton

Código 1:

O objeto de fábrica seria muito simples.

1
2 public class DesktopFactory {
3
4 public Desktop getDesktop (){
5 return Desktop.getInstance () ;
6 }
7 }
8 Implementação de fabrica

Código 2:

O uso da fabrica encapsula a criação do objeto, que no caso é delegada ao próprio objeto. Fazendo o método instanciador da classe ter visibilidade de pacote, a única forma de ter acesso ao objeto é por meio da fábrica. Isto esconde do utilizador da classe Desktop o facto dela ser um Singleton.

Padrões relacionados

Factory Method, Factory , Shared Object

Referências

[1] O Padrão Singleton
http://www.javabuilding.com/pattern/singleton.html

Licença

Creative Commons License Sérgio Taborda
Este trabalho é licenciado sob a Licença Creative Commons Atribuição-Uso Não-Comercial-Não a obras derivadas 3.0 Genérica .

4 opiniões sobre “Singleton”

  1. Neste post está escrito: “Iremos usar a classe Deus como exemplo para criação de um singleton…”.
    té+

  2. Muito bom Sérgio,

    Este Pattern é difícil de entender principalmente os outros tutoriais que encontramos na internet. Mas aqui está show de bola.
    Abraços.

    Seu velho amigo,
    Washington.

Deixe um comentário