Upload
fatinha-de-sousa
View
95
Download
2
Embed Size (px)
Citation preview
Padrão de Criação de ObjetosSingleton
Instituto Federal de Educação, Ciência e Tecnologiada Paraíba – campus CajazeirasCurso: Análise e Desenvolvimento de SistemasProfessor: Rodrigo AraújoDisciplina: Padrões de Projeto
Fátima FerreiraSérgio Diniz
Uma definição de Singleton
Um jeito fácil de acessar uma instânciade classe global.
Singleton
Exemplo de motivação
Exemplo de motivação
Padrão Singleton
É importante para algumas classes ter uma, e apenas uma,instância.
Embora possam existir muitas impressoras em um sistema,deveria haver somente um spooler de impressoras;
Padrão Singleton - Intenção
O Padrão Singleton é um padrão criacional;
Garantir que uma classe tenha somente uma instância efornecer um ponto de acesso global para a mesma;
Qual a funcionalidade disso?
Objetos que tratam de pools de conexão, saídas gráficas,impressão, objetos que cuidam de registros não devem serinstanciados mais de uma vez
Um outro uso do padrão SINGLETON é quando queremos umaclasse de Log para todo o sistema, sem precisarmos utilizarrecursos do sistema para instanciar uma classe sempre queprecisarmos gravar dados no servidor.
Padrão Singleton - Motivação
Alguns programadores devem estar pensando agora:
Mas isso é fácil! Basta eu ter uma variável global com ainstância do objeto e sempre acessar ela!
O problema é que essa variável sendo inicializada nocomeço da execução do projeto, essa classe estaráconsumindo recursos mesmo sem ser utilizada!
Com o Singleton, a classe só é instanciada quandovocê realmente precisa dela!
Padrão Singleton - Motivação
Padrão Singleton - Motivação
Como prevenir que um objeto não seja instanciado maisde uma vez?
Padrão Singleton - Motivação Criar um construtor privado. Com isso, a classe só pode serinstanciada dentro de algum dos seus próprios métodos!
Melhor maneira de tornar a classe responsável por manter o controle da sua única instância;
Padrão Singleton - Aplicabilidade
Use o padrão Singleton quando:◦ For preciso haver apenas uma instância de uma classe, e essa
instância tiver que dar acesso aos clientes através de umponto bem definido;
◦ A única instância tiver de ser extensível através desubclasses, possibilitando aos clientes usar uma instânciaestendida sem alterar o seu código;
Padrão Singleton - Estrutura
Lógica da classe: "Se o meu atributo instance é diferente denull retorno ele senão vou instanciar ele e retorná-lo. Assima próxima chamada a getInstance() vai retornar o mesmoobjeto, independente de se na chamada anterior ele era ounão diferente de null e todas as próximas chamadas,enquanto dure a aplicação sempre retornará o mesmoobjeto."
Padrão Singleton - Estrutura
Padrão Singleton - Participantes
◦ A classe Singleton será a classe cujo controle de instânciaúnica será aplicado. Ela possui como responsabilidades ocontrole da criação da única instância, e prover o pontode acesso a essa instância.
◦ Os clientes são todas as outras classes que irão acessar ainstância única através do método getSingleton() da classeSingleton.
Padrão Singleton - Colaborações
• Nesse padrão de projeto, irão ocorrer iterações entre a classeSingleton e os clientes. A classe Singleton possui um métodoestático getSingleton() que fornece aos clientes a únicainstância da classe. Desse modo, garantimos a existência de umponto único de acesso a esse objeto.
• Para garantirmos que o objeto seja único durante a execução,devemos desabilitar o acesso ao construtor da classe poroutras classes. A única classe que deve possuir acesso aoconstrutor é a própria classe Singleton, e nenhuma outra. Issopode ser feito tornando o construtor da classe privado.
Padrão Singleton - Consequências
Acesso controlado a instância única
◦ A própria classe encapsula sua instância única e, portanto, tem estritocontrole sobre como e quando os clientes a acessam;
Redução no namespace
◦ O Singleton é uma alternativa eficiente às variáveis globais. Evitapoluir o namespace com variáveis globais que armazenam instânciasúnicas;
Permite um número variável de instâncias◦ Pode permitir a criação de mais de uma instância do Singleton ou até
controlar o número de instâncias existentes. Somente a operaçãoinstance() precisa ser modificada;
• A implementação do padrão Singleton é bastante simples.Para tal, devemos primeiro adicionar uma variável estáticado mesmo tipo da classe na própria classe. Essa variáveldeverá ser privada, para evitar que outras classes possammodificá-la;
• A seguir, devemos adicionar um método público e estáticogetSingleton() à classe, que irá verificar se a instância foicriada. Se não foi criada ainda, esse método irá criar ela. Porfim, esse método retorna a instância armazenada.
Padrão Singleton - Implementação
• Para garantir que a instância seja única, e que nenhumcliente possa criar uma nova instancia da classe Singleton,devemos proteger o construtor da classe, para que apenas ométodo getSingleton() possa criar uma nova instância.
• Qualquer classe cliente irá fazer uma chamada ao métodoestático getSingleton() para obter a instância única daclasse. No momento em que for feita a primeira chamadaao método a instância será criada. Nas chamadas seguintes,a mesma instância será retornada.
Padrão Singleton - Implementação
Padrões RelacionadosVários padrões podem ser implementados UtilizandoSingleton, em particular:◦ Abstract Factory;
◦ Builder;
◦ Prototype;
Padrão Singleton - Exemplos
Exemplo 01• Imagine a seguinte situação:
• Imagine que tenhamos um Janela, essa seria nossa classe,chamada Janela...
Suponhamos que temos duas funções (que chamamos demétodos), seriam Abrir() e Fechar();
Então...
Exemplo 01
A questão é que para podermos acessar umaclasse e seus métodos/atributos temos queinstanciá-la.
Até aí tranquilo? Mas há um problema .
Toda vez que tivermos que abrir ou fechar essa janela, vamos ter queinstanciar?
Exemplo 01
Exemplo 01 – Solução Singleton
Exemplo 02
• “Imagine uma aplicação onde se faz necessáriocriar um arquivo de log para registrar quandousuário loga no sistema.”
Solução
Solução
Exemplo 03• Imagine a seguinte situação
• “Suponha que você deve trabalhar em um projetocomputacional para uma determinada fabrica de carros, osistema cadastrar carros da Ford e da Fiat, e deve controlar aquantidade de carros fabricados, e gerar um relatórioinformando esses dados. Contudo, não é cabível que existamais do que uma fábrica de carros para realizar esse controle.”
Atividade
Imagine a seguinte situação:
◦ “Gostaria de criar uma classe que gerasse uma conexão com meubanco de dados. Quando eu acessar a primeira vez essa classe, seráconstruída uma conexão, mas no decorrer da execução, caso existamais acessos ao banco, gostaria de utilizar a MESMA classe com aMESMA conexão."
Atividade