Singleton ou instanciar toda vez que eu uso? [duplicado]

14

Eu uso uma classe que apenas extrai dados de um objeto conhecido e os distribui para outros objetos conhecidos. Nenhuma configuração persistente ou tal é necessária nessa instância de classe.

Como devo decidir se devo configurar essa classe como um singleton , ou apenas instanciá-la sempre que eu precisar ?

    
por bebbi 15.09.2015 / 10:18
fonte

4 respostas

35

Se a turma não tiver estado, você pode considerar transformá-la em uma função ou método estático, dependendo do seu idioma.

    
por 15.09.2015 / 10:48
fonte
23

Às vezes, considera-se que o singleton é um antipadrão . A menos que o problema que está sendo resolvido especificamente exija o uso do padrão singleton, geralmente é melhor evitá-lo.

Você menciona que a função não teria nenhum estado ou outros requisitos de longa duração, portanto, a necessidade imediata de um objeto também não existe .

Uma função livre seria melhor (ou função estática ou similar dada a linguagem e o alvo), já que não tem estado e não introduz nenhum problema associado ao singleton.

Se uma função livre não for uma opção, um objeto vazio (sem membros de dados) provavelmente seria uma segunda opção próxima.

Em geral, meu conselho ao escolher um padrão é primeiro entender qual problema o padrão procura resolver e quais seriam as limitações e restrições do padrão. Uma vez entendido, se o problema a ser resolvido cai no espaço problemático desse padrão, então esse padrão seria um candidato para uso.

    
por 15.09.2015 / 11:34
fonte
4

Como você determina quais são esses 'objetos conhecidos' - se é um código embutido no código (ou seja, o objeto é um estático ou singleton em si), então é melhor usar um método estático para executar o processamento, apenas chamar isso de conforme necessário.

Não vejo por que você precisaria de uma turma inteira para esse processo, a menos que esses objetos conhecidos sejam considerados internamente para a classe. Neste caso, depende de quantas vezes você precisa e do custo de construção, é preciso muito esforço, um singleton é provavelmente o melhor.

    
por 15.09.2015 / 11:17
fonte
3

Eu acho que a resposta de Niall é boa e a resposta aceita está correta, mas quero adicionar um pouco na veia de usar Singletons.

O padrão Singleton é um pouco como o comunismo. Parece bom no papel, mas quando você mistura com as pessoas as coisas tendem a desmoronar.

A coisa é que o padrão Singleton não é, inerentemente, um antipadrão. É mais que a maioria das implementações (ingênuas) dela tendem a passar por cima de aspectos importantes ou causar possíveis problemas.

Por exemplo, em C ++, um Singleton inicializado globalmente pode ser alocado praticamente sempre antes que o loop principal seja iniciado. Combinar múltiplos Singletons dessa maneira significa que você não tem ideia de qual ordem eles irão inicializar um em relação ao outro. A ordem de limpeza é similarmente arbitrária (mas geralmente o inverso da ordem em que foram inicializados). (Existem algumas regras básicas para isso, mas a maioria é deixada para os demônios nasais .)

Objetos globais e facilmente acessíveis também tendem a se desviar para os reinos de uma Classe de Deus , que é muito um anti-padrão. Idéias como "Eu já tenho uma turma de gerente, vou ficar lá" são fáceis e a solução é rápida. Este é um caso de dívida técnica .

Um Singleton controlado gerenciado corretamente pode ser muito útil e não causar problemas, mas eles são um padrão mais difícil de acertar do que as pessoas tendem a esperar. A pior parte é que os exemplos de livros de texto tendem a ensinar hábitos realmente ruins para os Singletons.

Para o seu caso específico, uma vez que você não tem estado e não precisa carregar ou descarregar, você não precisa de um objeto. Uma função estática ou equivalente deve atender às suas necessidades.

E, como não posso comentar (sacode punho) , quero deixar em segundo plano o ponto de Niall em entender o que um padrão resolve e onde funciona. Também recomendo pesquisar como ele funciona e como implementá-lo da melhor forma, pois implementar um padrão corretamente é no mínimo tão importante quanto escolher o padrão certo .

    
por 15.09.2015 / 16:58
fonte