Buscar

Apres Padrão de Projetos GoF Singleton

Prévia do material em texto

Padrão de Projetos - GoF 
Singleton
Grupo:
Roberta Sá
Gabriel Dutra
Haydê Machado
Matheus Siqueira
Problemas
1. Garantir que uma classe possui apenas uma instância.
A motivação mais comum é controlar um recurso compartilhado. Por exemplo, 
imagine a gerência de conexões com o banco de dados. Não é desejável que 
cada classe crie seus próprios gerenciadores de conexão, pela alta probabilidade 
de sobrecarregar o banco.
2. Compartilhar estado de uma instância globalmente.
Idealmente, o uso de variáveis globais deve evitado. No entanto, em casos 
como o exemplo anterior, é necessário que diferentes módulos da aplicação 
estejam cientes de um estado compartilhado.
Solução
● Tornar o construtor da classe privado. 
● Criar um novo método construtor da classe. O novo construtor usa o 
construtor padrão e guarda a nova instância da classe em uma variável 
estática, mas somente se esta variável já não possui uma instância. Em 
seguida, ele retorna esta variável.
● Por consequência, todas as chamadas seguintes ao construtor retornarão o 
objeto que foi instanciado na primeira chamada.
Solução - Código de exemplo
Solução - Código de exemplo (thread-safe)
Padrão Singleton
● Consequências
○ Vantagens:
■ Melhora o desempenho do software quando utilizado em classes que nunca mudam de 
estado ou que sempre precisam de somente uma instância executando.
■ Melhora a leitura do código, tendo mente que o Singleton, apesar de ser um padrão 
(aplica uma linguagem universal), é o mais conhecido dentre os padrões.
○ Desvantagens:
■ Pode trazer problemas de desempenho se seu software não for utilizar com frequência a 
classe que implementa o padrão.
■ Adiciona complexidade aos testes.
■ Requer tratamento especial em ambientes multi-threads.
Padrão Singleton
● Usos Conhecidos: 
○ O Padrão Singleton é utilizado em Drivers que precisam de um ponto de acesso único e 
global para gerenciar diversos recursos.
● Exemplo:
Sem Singleton Com Singleton
public class BancoDeDados {
 ...
 public BancoDeDados(){
 ...
 }
}
public class BancoDeDados {
 private static BancoDeDados instance;
 ...
 private BancoDeDados(){
 ...
 }
 public static BancoDeDados getInstance(){
 if( instance == null ){
 instance = new BancoDeDados();
 }
 return instance;
 }
 ...
}
Aplicação Real
Seguindo o padrão Singleton, a classe 
SingletonDBConnection possui um 
construtor privado responsável por 
criar a conexão com o banco e 
atualizar o valor das variáveis 
estáticas dataSource, dbConnect e 
singleInstance, que posteriormente 
serão utilizadas em outras funções da 
classe;
Aplicação Real
Conforme dito anteriormente, a função 
getInstance() checa se já existe uma instância 
de SingletonDBConnection criada, caso exista 
retorna essa instancia que foi guardada na 
variável estática, e caso não exista cria uma 
nova instância a partir do construtor privado, 
também guardando na variável estática, e a 
retorna. Assim fica garantida a premissa do 
padrão singleton que diz respeito à classe 
possuir apenas uma instância
Referências
http://www.dpi.ufv.br/projetos/apri/?page_id=671
https://www.thiengo.com.br/padrao-de-projeto-singleton
https://refactoring.guru/design-patterns/singleton
http://blog.cleancoder.com/uncle-bob/2015/07/01/TheLittleSingleton.html
http://codethataint.com/blog/using-singleton-class-for-db-connection-java/
https://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-e
xamples

Continue navegando