Padrão de Criação de Objetos Singleton Instituto Federal de Educação, Ciência e Tecnologia da Paraíba – campus Cajazeiras Curso: Análise e Desenvolvimento de Sistemas Professor: Rodrigo Araújo Disciplina: Padrões de Projeto Fátima Ferreira Sérgio Diniz
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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."