O documento descreve o padrão de projeto Estado, que permite que um objeto altere seu comportamento de acordo com mudanças internas de estado. Isso é feito definindo classes concretas para cada estado possivel e delegando responsabilidades para essas classes conforme o estado muda, permitindo que o objeto "pareça mudar de classe".
1. Singleton | 99
Lista de controle
1. Definir um privado estático atributo na classe "única instância".1. Definir um privado estático atributo na classe "única instância".1. Definir um privado estático atributo na classe "única instância".1. Definir um privado estático atributo na classe "única instância".
2. Definir um público estático função de acesso na classe.2. Definir um público estático função de acesso na classe.2. Definir um público estático função de acesso na classe.2. Definir um público estático função de acesso na classe.
3. Fazer "inicialização lenta" (criação na primeira utilização) no acessor3. Fazer "inicialização lenta" (criação na primeira utilização) no acessor
função.
4. Definir todos os construtores para ser protegido ou privado.4. Definir todos os construtores para ser protegido ou privado.4. Definir todos os construtores para ser protegido ou privado.4. Definir todos os construtores para ser protegido ou privado.4. Definir todos os construtores para ser protegido ou privado.
5. Os clientes só podem utilizar a função de assessor para manipular o5. Os clientes só podem utilizar a função de assessor para manipular o
Singleton.
Regras de ouro
Abstract Factory, Builder, e Prototype pode usar Singleton na sua implementação.
objetos de fachada são frequentemente Singletons porque apenas um objeto Fachada é necessária.
objetos de estado são frequentemente Singletons.
A vantagem de Singleton sobre variáveis globais é que você tem certeza absoluta do
número de casos em que você usar Singleton, e, você pode mudar sua mente e gerenciar
qualquer número de instâncias.
O padrão de design Singleton é um dos padrões mais usados inadequadamente. Singletons se
destinam a ser usadas quando uma classe deve ter exatamente um exemplo, nem mais, nem
menos. Designers utilizam frequentemente Singletons em uma tentativa equivocada de substituir
variáveis globais. A Singleton é, para os efeitos, uma variável global. Será que o Singleton não
acabar com o global, ele simplesmente renomeia.
Quando é Singleton desnecessário? Resposta curta - a maior parte do tempo.Quando é Singleton desnecessário? Resposta curta - a maior parte do tempo.
Resposta longa: quando é mais simples para passar um recurso objeto como uma referência para os objetos
que precisam, em vez de objetos deixando acessar o recurso globalmente.
O problema real com Singletons é que eles dão-lhe uma boa desculpa como não pensar
cuidadosamente sobre a visibilidade apropriada de um
2. 100 | coisa única
objeto. Encontrar o equilíbrio certo de exposição e proteção para um objeto é
fundamental para manter a flexibilidade.
O nosso grupo tinha um mau hábito de usar dados globais, então eu fiz um grupo de estudo sobre Singleton.
A próxima coisa que eu sei Singletons apareceu em todos os lugares e nenhum dos problemas relacionados com
dados globais foi embora.
A resposta à pergunta de dados global não é " Torná-lo um Singleton".A resposta à pergunta de dados global não é " Torná-lo um Singleton".
A resposta é, " Por que diabos você está usando dados global?" Alterar o nome nãoA resposta é, " Por que diabos você está usando dados global?" Alterar o nome nãoA resposta é, " Por que diabos você está usando dados global?" Alterar o nome não
muda o problema.
Na verdade, ele pode torná-lo pior, porque lhe dá a oportunidade de dizer, " Bem, eu não vouNa verdade, ele pode torná-lo pior, porque lhe dá a oportunidade de dizer, " Bem, eu não vou
fazer isso, eu estou fazendo isso" - mesmo que isso e que são a mesma coisa.fazer isso, eu estou fazendo isso" - mesmo que isso e que são a mesma coisa.
3. Estado | 101
Estado
Intenção
• Permitir que um objecto para alterar o seu comportamento quando as suas mudanças de estado interno. O
objeto aparecerá para mudar sua classe.
• Uma máquina de estado orientado para o objecto
• invólucro + wrappee polimórfica + colaboração
Problema
O comportamento de um objeto monolítico é uma função do seu estado, e deve mudar seu
comportamento em tempo de execução, dependendo esse estado. Ou, um pedido é characterixed por
grandes e numerosos declarações de caso que o fluxo de vector de controlo com base no estado do
pedido.
Discussão
O padrão de Estado é uma solução para o problema de como tornar o comportamento
dependem do estado.
• Definir uma classe "contexto" para apresentar uma interface única para o mundo exterior.
• Definir uma classe base abstrata Estado.
• Representar os diferentes "estados" da máquina estatal como classes derivadas da
classe base Estado.
• Definir o comportamento específico do estado nas classes do Estado derivada apropriadas.
• Manter um ponteiro para o "estado" atual na classe "contexto".
• Para alterar o estado da máquina de estado, alterar o ponteiro atual "estado".
O padrão de Estado não especifica onde as transições de estado será definido. As opções
são duas: o "contexto" objeto, ou cada classe derivada Estado individual. A vantagem da segunda
opção é a facilidade de adicionar novas classes de Estado derivada. A desvantagem é cada
classe Estado derivada tem conhecimento de (acoplamento a) seus irmãos, que introduz as
dependências entre as subclasses.
4. A abordagem baseada em tabelas para projetar máquinas de estados finitos faz um bom trabalho de
especificar transições de estado, mas é difícil para adicionar ações para acompanhar as transições de estado. A
abordagem baseada em padrões usa código (em vez de estruturas de dados) para especificar transições de
estado, mas ele faz um bom trabalho de ações de transição de estado que acomodam.
Estrutura
A interface do máquina de estado é encapsulado na classe "wrapper". A interface do
hierarquia wrappee espelha a interface do invólucro com a exceção de um parâmetro
adicional.
O parâmetro extra permite que classes wrappee derivado de chamar de volta para a classe
wrapper conforme necessário. Complexidade que de outro modo arrastar para baixo a classe de
invólucro é nitidamente compartimentado e encapsulado numa hierarquia polimórfica para que os
delegados invólucro objeto.
Exemplo
O padrão Estado permite que um objeto para mudar seu comportamento quando seu estado interno
muda.
Este padrão pode ser observado em uma máquina de venda automática. Máquinas de venda
automática tem estados com base no inventário, a quantidade de moeda 102 | Estado
5. depositada, a capacidade de fazer a mudança, o item selecionado, etc. Quando a moeda é depositado e uma
seleção é feita, uma máquina de venda automática será ou entregar um produto e nenhuma mudança,
entregar um produto e mudança, entregar nenhum produto devido à moeda insuficiente sobre depósito, ou
entregar nenhum produto devido ao esgotamento de estoques.
Lista de controle
1. Identificar uma classe existente ou criar uma nova classe, que servirá como a "máquina de
estado" do ponto de vista do cliente. Essa classe é a classe "wrapper".
2. Crie uma classe base Estado que replica os métodos da interface de máquina de estado.
Cada método recebe um parâmetro adicional: uma instância da classe wrapper. A classe
base Estado especifica qualquer comportamento útil "default".
3. Crie uma classe Estado derivada para cada estado de domínio. Estas classes derivadas única
substituir os métodos que eles precisam para substituir.
4. A classe wrapper mantém uma "corrente" objeto de estado.
5. Todos os pedidos de clientes para a classe de mensagens publicitárias são simplesmente delegado ao objeto
estado atual, e o objeto de invólucro de isto ponteiro é passado.estado atual, e o objeto de invólucro de isto ponteiro é passado.estado atual, e o objeto de invólucro de isto ponteiro é passado.
6. Os métodos estaduais alterar o estado "corrente" no objeto wrapper conforme apropriado.
Estado | 103