Programação Orientada a Objetos
(Maio/2003) |
Singleton
Objetivo
_ Assegurar que uma classe tenha uma única instância e prover um ponto de acesso global a esta instância
Motivação
_ Algumas classes devem ser instanciadas uma única vez:
_ Um spooler de impressão
_ Um sistema de arquivos
_ Um Window manager
_ Um objeto que contém a configuração de um programa
_ Como assegurar que uma classe possua apenas uma instância e que esta
instância seja facilmente acessível?
_ Uma variável global deixa a instância acessível mas não inibe a instanciação múltipla (EX. acesso a dados)
_ Uma melhor solução: faça com que a classe em si seja responsável pela
manutenção da instância única
_ Este é o padrão Singleton ("que-possui-apenas-um")
Aplicabilidade
_ Use o padrão Singleton quando:
_ Deve haver uma única instância de uma classe e esta instância deve ser
acessada a partir de um ponto de acesso bem-conhecido
_ Quando a instância única deve ser extensível através de subclasses e clientes
podem usar instâncias diferentes polimorficamente, sem modificação de código
Estrutura
Participantes
_ Singleton
_ Define uma operação getInstance() que permite que clientes acessem sua
instância única
_ É um método estático (class method)
_ Pode ser responsável pela criação de sua instância única
Colaborações
_ Clientes acessam a instância apenas através da operação getInstance() do
Singleton
Consequências
_ Vários benefícios existem:
_ Acesso controlado à instância única
_ O singleton tem controle sobre como e quando clientes acessam a instância
_ Espaço de nomes reduzido
_ O Singleton é melhor que variáveis globais, já que as "globais" podem ser encapsuladas na instância única, deixando um único nome externo visível
_ Permite refinamento de operações e de representação
_ Várias classes Singleton (relacionadas ou não via herança) podem obedecer
a mesma interface, permitindo que um singleton particular seja escolhido
para trabalhar com uma determinada aplicação em tempo de execução
_ Permite a existência de um número variável de instâncias
_ É fácil fazer com que o Singleton crie um número fixo, ou um número
máximo de instâncias em vez de apenas uma única instância
_ Apenas a implementação interna do Singleton precisa mudar
_ Mais flexível que métodos estáticos
_ Embora possa parecer que podemos fazer o equivalente a um Singleton com métodos estáticos, lembre que isso não permitiria o polimorfismo:
NomeDeClasse.xpto(); // chamada não é polimórfica
// ... versus ...
Config conf = Config.getInstance();
conf.xpto(); // essa chamada é polimórfica
Considerações de implementação
Como assegurar que haja uma única instância?
_ Uma forma é de não permitir chamadas ao construtor
public class Config implements ConfigIF {
private static ConfigIF instânciaÚnica = null;
private Config() {} // o compilador não vai gerar um construtor defaul
public static ConfigIF getInstance() {
if(instânciaÚnica == null) {
// "lazy instantiation"
instânciaÚnica = new Config();
}
return instânciaÚnica;
}
}
_ Observe que o uso de lazy instantiation é preferível a retornar uma instância
estática da classe
_ Lazy instantiation pode ser mais rápida se a instanciação/inicialização for lenta
Exemplo de código
_ Veremos um exemplo de Singleton junto com Abstract Factory
_ Exemplo (javacoder.net) executado no BlueJ
/*
Singleton Creational GoF Pattern - Java Implementation
Copyright (C) Ben Hill 2002 - ben@javacoder.net - www.javacoder.net/~ben
This program is free software; you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program;
if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA
http://www.fsf.org/licenses/gpl.txt
*/
package net.javacoder.patterns.creational.singleton;
/**
* Defines an instance operation that allows clients to access it's single instance
* @author ben@javacoder.net
* @date January 2002
* @version 1.0
*/
public class Singleton {
private static Singleton instance; // own instance
/* protected to enable controlled subclassing */
protected Singleton() {
}
public static Singleton getInstance() {
// 'lazy' evaluate instance
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void operation() {
System.out.println("Singleton.operation() executing" );
}
}
--------------------
*
Singleton Creational GoF Pattern - Java Implementation
Copyright (C) Ben Hill 2002 - ben@javacoder.net - www.javacoder.net/~ben
This program is free software; you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program;
if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA
http://www.fsf.org/licenses/gpl.txt
*/
package net.javacoder.patterns.creational.singleton;
/**
* Represents the client of this pattern.
* @author ben@javacoder.net
* @date January 2002
* @version 1.0
*/
public class Client {
public static void main(String[] args) {
// use getInstance to obtain Singleton instance
Singleton s = Singleton.getInstance();
// use operation
s.operation();
}
}
Referências web:
1. jamesthornton.com/eckel/TIPatterns/html/Contents.html
2. developer.java.sun.com/developer/technicalArticles/Programming/singletons/
3. www.patterndepot.com/put/8/JavaPatterns?.htm
4. www.research.umbc.edu/~tarr/dp/fall00/cs491.html
5. www.javacoder.net/patterns.jsp
6. home.earthlink.net/~huston2/dp/patterns.html
7. www.inf.furb.br/seminco/2002/artigos/Oss-seminco2002-33.pdf
8. www.agcs.com/supportv2/techpapers/patterns/papers/tutnotes/index.htm