Programação Orientada a Objetos


Turma de 2003 - Professor Carlo Emmanoel

Singleton

Ilan Chamovitz

Sandro de Azambuja

ilan@api.adm.br

sandro@soft.com.br

(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