Baixe o app para aproveitar ainda mais
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
Compartilhar