Pergunta

Em nossa camada de acesso a dados no trabalho que temos esta implementação padrão onde a classe é acessado através de uma propriedade pública singleton que é algo como isto:

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

Agora, eu recebo o que o código está fazendo, mas eu queria saber por que você faria isso mais apenas criar uma instância da classe cada vez que é utilizado?

Foi útil?

Solução

EDIT: Oh whoops eu não entendi a parte "Camadas de acesso a dados". Mas eu tenho um exemplo de que também: Se seu aplicativo funis de vários segmentos todos os seus chamadas de banco de dados através de uma única classe, apenas um thread nunca vai acessar o banco de dados ao mesmo tempo, evitar condições de corrida

.

Se você tem um mecanismo de registro em uma aplicação multi-threaded que você usa para cuspir todas as excepções e informações basta escrever em (especialmente para serviços ou aplicativos que estão sempre correndo, imprimir status sempre que as coisas acontecem), você vai executar em problemas de bloqueio de arquivo. Eu uso uma classe singleton logger, de modo que apenas uma thread nunca vai ter acesso ao Logger, eo resto vai esperar até o Logger é livre para escrever sua linha no arquivo de texto.

Existem muitas razões legais para usar um singleton, mas eu era como você e não tinha idéia do que eles estavam PARA até que eu corri para este problema com o acesso a arquivos em um aplicativo de vários segmentos.

Outras dicas

Você pode querer fazer isso também, o seu bloqueio verificado dupla, ele irá acelerar o acesso ao seu Singleton

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }

A resposta é muito simples: você deseja obter o mesma objeto cada vez que for usado.

Ele lhe dá as vantagens de ser uma variável global (ou seja, há apenas um) com as vantagens de ser um objeto de classe (entre outras coisas, ele pode fazer a inicialização invisable a primeira vez que ela é necessária).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top