Eu li opiniões diferentes sobre o padrão singleton. Alguns sustentam que deve ser evitado a todo custo e outros que podem ser úteis em determinadas situações.
Uma situação em que eu uso singletons é quando eu preciso de uma factory (digamos, um objeto f do tipo F) para criar objetos de uma determinada classe A. A factory é criada uma vez usando alguns parâmetros de configuração e é usada sempre que um objeto de o tipo A é instanciado. Portanto, toda parte do código que deseja instanciar A busca o singleton f e cria a nova instância, por exemplo
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Então, o meu cenário geral é que
- Preciso de apenas uma instância de uma classe por motivos de otimização (não preciso de vários objetos de fábrica) ou para compartilhar o estado comum (por exemplo, a fábrica sabe quantas instâncias de A ainda podem ser criadas)
- Eu preciso de uma maneira de ter acesso a esta instância f de F em diferentes locais do código.
Não estou interessado em discutir se esse padrão é bom ou ruim, mas supondo que eu queira evitar o uso de um singleton, que outro padrão posso usar?
As idéias que tive foram: (1) obter o objeto de fábrica de um registro ou (2) criar a fábrica em algum momento durante a inicialização do programa e depois passar a fábrica como um parâmetro.
Na solução (1), o próprio registro é um singleton, então acabei de mudar o problema de não usar um singleton da fábrica para o registro.
No caso (2), preciso de alguma fonte inicial (objeto) da qual o objeto factory vem, por isso tenho medo de voltar a usar outro singleton (o objeto que fornece minha instância de fábrica). Seguindo essa cadeia de singletons, talvez eu possa reduzir o problema a um singleton (o aplicativo inteiro) pelo qual todos os outros singletons são gerenciados direta ou indiretamente.
Essa última opção (usando um singleton inicial que cria todos os outros objetos exclusivos e injeta todos os outros singletons nos lugares certos) seria uma solução aceitável? Essa é a solução sugerida implicitamente quando alguém aconselha não usar singletons ou quais são outras soluções, por exemplo, no exemplo ilustrado acima?
EDITAR
Como acho que o ponto da minha pergunta foi mal interpretado por alguns, aqui estão mais algumas informações. Conforme explicado aqui , por exemplo , a palavra singleton pode indicar (a) uma classe com um objeto de instância única e (b) um padrão de design usado para criar e acessar esse objeto.
Para tornar as coisas mais claras, vamos usar o termo objeto único para (a) e padrão singleton para (b). Então, eu sei o que são o padrão singleton e a injeção de dependência (BTW, ultimamente tenho usado DI intensamente para remover instâncias do padrão singleton de algum código no qual estou trabalhando).
O que quero dizer é que, a menos que o gráfico inteiro de objetos seja instanciado a partir de um único objeto vivendo na pilha do método principal, sempre haverá a necessidade de acessar alguns objetos exclusivos através do padrão singleton.
Minha pergunta é se a criação e a fiação completas de gráficos de objetos dependem do método principal (por exemplo, através de uma poderosa estrutura DI que não usa o próprio padrão) é a única solução livre de padrão singleton .