O Padrão Singleton
125
5. O Padrão Singleton
Nossa próxima parada é o Padrão Singleton, nosso
passaporte para criar objetos únicos para os quais há
apenas uma instância. Talvez você que feliz ao saber
que, de todos os padrões, o Singleton é o mais simples
em termos de seu diagrama de classes – na verdade, o
diagrama contém apenas uma classe! Mas não que muito
à vontade; apesar de sua simplicidade em relação ao
design de classes, iremos encontrar algumas diculdades
em sua implementação.
Eu te digo que ele é
ÚNICO. Veja as linhas, as
curvas, os faróis!
Você está falando comigo ou
com o carro? Ah, e quando
você irá devolver minha luva
térmica?
Objetos Únicos
CG_ucpadroes_RI2016.indb 125 22/11/2016 09:36:23
Use a Cabeça Padrões de Projetos
126
Desenvolvedor: Que uso é esse?
Guru: Há muitos objetos dos quais precisamos apenas de um: grupos de linhas, caixas
de diálogo, objetos que cuidam de preferências e congurações de registro, objetos
usados para registro e objetos que agem como drivers de dispositivos para dispositivos
como impressoras e placas grácas. Na verdade, para muitos desses tipos de objetos, se
instanciássemos mais de uma vez, encontraríamos todos os tipos de problema, como
comportamento inadequado do programa, uso excessivo de recursos ou resultados
inconsistentes.
Desenvolvedor: OK, então talvez existam classes que devem ser instanciadas uma vez, mas
preciso de um capítulo inteiro para isso? Não posso apenas fazer isso por convenção ou
por variáveis globais? Você sabe, como em Java, era possível fazer isso com uma variável
estática.
Guru: De muitas maneiras, o Padrão Singleton é uma convenção para garantir que um e
apenas um objeto seja instanciado para uma dada classe. Se você tiver uma melhor, por
favor, deixe-nos saber; mas lembre-se de que, como todos os padrões, o Padrão Singleton
é um método comprovado para garantir que apenas um objeto seja criado. O Padrão
Singleton também nos dá um ponto de acesso global, assim como uma variável global,
mas sem as desvantagens.
Desenvolvedor: Quais desvantagens?
Guru: Bem, veja um exemplo: se você atribuir um objeto a uma variável global, esse objeto
poderá ser criado quando seu aplicativo for iniciado.* Certo? E se esse objeto tiver muitos
recursos e seu aplicativo nunca acabar de usá-lo? Conforme você verá, com o Padrão
Singleton, podemos criar nossos objetos somente quando eles são necessários.
Desenvolvedor: Ainda não parece ser muito difícil.
Guru: Se você dominar bem as variáveis e os métodos de classe estática, assim como os
modicadores de acesso, será fácil. Mas, nos dois casos, é interessante ver como o Singleton
funciona e, apesar de parecer simples, o código Singleton é difícil de acertar. Basta se
perguntar: como evitar que mais de um objeto seja instanciado? Não é óbvio, é?
*Na verdade, ele depende da implementação. Alguns JVM criarão esses objetos lentamente.
O que é isto? Um capítulo
inteiro sobre como
instanciar apenas UM
OBJETO!
É o ÚNICO objeto.
CG_ucpadroes_RI2016.indb 126 22/11/2016 09:36:23
O Padrão Singleton
127
O pequeno Singleton
Um breve exercício socrático no estilo de The Little Lisper
Como você criaria um único objeto? new MyObject();
E se outro objeto quisesse criar um MyObject?
Poderia chamar new em MyObject de novo?
Então, se tivermos uma classe, sempre poderemos
instanciá-la uma ou mais vezes?
E se não for?
Humm, interessante. Você sabia que isso era possível?
public MyClass {
private MyClass() {}
}
O que isto significa?
Bem, existe ALGUM objeto que possa usar o construtor
particular?
Por que não?
OK. Foi apenas uma idéia. O que isso significa?
Sim, claro.
Sim, mas apenas se for uma classe pública.
Bem, se não for uma classe pública, apenas as
classes no mesmo pacote poderão instanciá-la
mais de uma vez.
Não, nunca pensei nisso, mas acho que faz
sentido por ser uma definição legal.
Imagino que seja uma classe que não possa
ser instanciada porque tem um construtor
particular.
Humm, acho que o código em MyClass é o
único código que poderia chamá-lo. Mas isso
não faz muito sentido.
Porque seria preciso ter uma instância da
classe para chamá-lo, mas não posso ter uma
instância porque nenhuma outra classe pode
instanciá-lo. É a questão do ovo e a galinha:
posso usar o construtor a partir de um objeto
do tipo MyClass, mas nunca posso instanciar
esse objeto porque nenhum outro objeto pode
usar “new MyClass()”.
MyClass é uma classe com um método
estático. Podemos chamar o método estático
assim:
MyClass.getInstance();
CG_ucpadroes_RI2016.indb 127 22/11/2016 09:36:23
Get Use A Cabeça Padrões E Projetos now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.