Padrões de Projeto Prof. Alexandre Vidal DEINF-UFMA Fevereiro de 2007
Singleton (padrão de criação) intenção: garantir que uma classe tenha somente uma instância e fornecer um ponto global de acesso para essa instância.
Singleton (padrão de criação) motivação: muitas impressoras precisam de um único spooler; sistemas normalmente únicos: um sistema de arquivos; um sistema gerrenciador de janelas.
Singleton (padrão de criação) aplicabilidade (quando usar o padrão): quando deve existir uma única instância de uma classe e o acesso à essa instância deve ser através de um ponto bem conhecido; quando for necessário estender a única instância de uma classe.
Singleton (padrão de criação) Estrutura
Singleton (padrão de criação) Participantes Singleton: define uma operação static instance() que permite aos clientes acessarem sua únic instância; pode ser responsável pela criação de sua própria instância única.
Singleton (padrão de criação) Colaborações os clientes acessam uma instância Singleton apenas através daoperação instance() do Singleton.
Singleton (padrão de criação) Conseqüências acesso controlado à instância única; redução do espaço de nomes (menos variáveis globais para armazenar instâncias únicas); permite um número variável de instâncias (alterando o padrão para controlar esse número);
Singleton (padrão de criação) declaração da classe Singleton class Singleton{ public: static Singleton* instance(); protected: Singleton(); private: static Singleton* _instance; }
Singleton (padrão de criação) Implementação da classe Singleton Singleton* Singleton::_instance = 0; Singleton* Singleton::instance() { } if (_instance == 0) _instance = new Singleton; } return _instance;
Singleton (padrão de criação) usos conhecidos ver página 136 no GoF (traduzido); Padrões Relacionados Abstract Factory; Builder; Prototype.
intenção: fornecer um substituto de outro objeto para controlar o acesso ao mesmo. a.k.a.: Surrogate
motivação: adiar o custo da criação integral e inicialização de um objeto até o momento necessário. por exemplo, criação de objetos gráficos, tais como grandes imagens.
aplicabilidade: remote proxy: representante local para um objeto remoto acesso a remote dbms, CORBA; virtual proxy: cria objetos caros sob demanda image proxy; protection proxy: controla o acesso para o objeto original; smart reference: adiciona operações sobre um pointer garbage collection (controle do número de referências); verifica se o objeto real está bloqueado antes de ser acessado.
Estrutura
Participantes Proxy: mantém uma referência para o objeto real; fornece interfce idêntica a de Subject; controla o acesso ao objeto real; pode ser responsável pela criação ou exclusão do objeto real; remote proxies: codificam e enviam uma solicitação para um objeto real em outro espaço de endereçamento; virtual proxies: podem manter cache sobreo objeto real para postergar o acesso ao mesmo; protection proxies: verificam permissões de acesso do solicitante.
Participantes Subject: define uma interface comum para RealSubject e Proxy; RealSubject: define o objeto real representado pelo proxy.
Colaborações o Proxy pode, quando apropriado, repassar solicitações para o RealSubject.
Conseqüências um proxy remoto pode ocultar o fato que um objeto reside em um espaço de enderaçamento diferente; um proxy virtual pode implementar otimizações, como criação de um objeto sob demanda;
Implementação (aspectos) sobrecarga do operador de acesso a membros em C++; o proxy só precisa conhecer o objeto real se vão instanciá-los. Caso contrário, podem tratar todas as classes Realsubject de maneira uniforme.
exemplo de código (java) public class ProxyDisplay extends JxFrame { public ProxyDisplay() { super("display proxied image"); JPanel p = new JPanel(); getcontentpane().add(p); p.setlayout(new BorderLayout()); ImageProxy image = new ImageProxy("elliott.jpg",321, 271); p.add("center", image); p.add("north", new Label(" ")); p.add("west", new Label(" ")); setsize(370, 350); setvisible(true); }
exemplo de código (java) public class ImageProxy extends JPanel{... public void paint(graphics g) { if (tracker.checkid(0)) { g.drawimage(img, 0, 0, this);//draw loaded image } else {//draw box outlining image if not loaded yet g.setcolor(color.black); g.drawrect(1, 1, width-2, height-2); } } }
usos conhecidos ver página 207 no GoF (traduzido); Padrões Relacionados Adapter; Decorator; Proxy.