Padrão de design criacional: 1. Padrão singleton

O que é um padrão de design de criação?

(26 de dezembro de 2020)

Os padrões de design de criação lidam com a criação ou clonagem de novos objetos de uma classe. A clonagem ocorre quando um tipo de objeto semelhante já existe e, em vez de instanciar um novo objeto, clonamos o existente.

As diferentes maneiras de criar objetos influenciarão muito como um problema é resolvido. Portanto, diferentes linguagens afetam os padrões possíveis de usar.

Padrão Singleton

O padrão Singleton é usado quando exigimos apenas uma única instância de uma classe. Por exemplo, fazer conexão DB em um aplicativo, fila de impressão da impressora, usando loggers pois requerem muitos recursos. Em todos esses casos, se houver várias instâncias, isso criará confusão e também inconsistência.

Esse padrão é usado quando a instância é compartilhada e acessível globalmente em todo o aplicativo. Certificar-se de que o acesso a recursos compartilhados é seguro para threads é um bom exemplo de onde esse tipo de padrão pode ser vital a intenção de um padrão Singleton é fornecer acesso global a uma classe restrita a uma instância.

Vamos ver como o objeto é criado

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

Agora, sempre que um objeto de DummyClass é necessário, seu construtor é chamado e um objeto é criado. Isso é chamado de inicialização Eager.

Mas, no padrão singleton, exigimos apenas uma única instância de uma classe. Digamos, se uma conexão de banco de dados já estiver configurada, não precisamos criar uma nova conexão de banco de dados e devemos usar a conexão já existente. Vamos ver como fazer isso.

Aqui, limitamos o escopo do construtor à própria classe. Portanto, para criar o objeto desta classe, o método estático getDBConnection () da classe deve ser chamado. Em seguida, ele verificará se o objeto dbConnection é nulo e, em seguida, criará um novo objeto de conexão e retornará, caso contrário, retornará o objeto de conexão existente.

Este exemplo demonstra o conceito de inicialização lenta . Isso significa que não estamos criando o objeto da classe a menos que seja realmente necessário. Conseqüentemente, este programa é mais eficiente em termos de recursos.

Existem compensações no princípio de design Singleton. Se houver vários threads de computação em execução, pode haver problemas causados ​​pelos threads tentando acessar o único objeto compartilhado.

Problemas na implementação acima

Agora, é possível que dois threads ao mesmo tempo estão chamando o método getDBConnection e o objeto ainda não foi criado. Para ambos os threads, o objeto dbConnection será nulo e ambos tentarão criar uma nova instância e usá-la em seu lugar. Portanto, é muito importante ter certeza de que um único encadeamento pode acessar getDBConnection por vez, de modo que várias instâncias não sejam criadas.

Para obter um encadeamento -safe classe singleton é tornar o método de acesso global sincronizado, de modo que apenas um thread possa executar este método por vez.

Apenas um thread pode acessar este bloco de código sincronizado por vez

Você pode estar pensando que o problema está resolvido agora. Mas, infelizmente não! Para impor a propriedade singleton, colocamos um bloqueio no método getDBConnection estático, mas comprometendo seu desempenho ao mesmo tempo. Quando um objeto já foi criado, então, vários threads têm que esperar para obter a instância existente desse objeto. Podemos fazer algo melhor? Vejamos.

Como é evidente que, o bloqueio só é necessário quando a instância é nula para que diferentes threads não criem várias instâncias. Portanto, podemos colocar uma condição sincronizada dentro da condição if, em que verificamos se a instância é nula ou não, e adicionar uma verificação dupla para eliminar os cenários de várias instâncias.

Em uso real, o padrão singleton pode ser implementado de diferentes maneiras. Ele apenas define o propósito básico que esse padrão está atendendo, mas a implementação do código pode ser diferente.

Isso é tudo da minha parte Espero que esteja claro agora, onde, quando e como usar o padrão de design singleton. Você pode consultar o livro, o catálogo de padrões de design da Gang of Four para mais compreensão.

Informe-nos nos comentários abaixo, se tiver alguma dúvida. Se você gosta deste blog, compartilhe-o com seus amigos. Feliz engenharia de software!

Parte 2: