O documento discute o padrão de projeto Factory Method. O Factory Method define uma interface para criar objetos, mas deixa as subclasses decidirem quais classes instanciar. Isso permite a criação polimórfica de objetos e dissocia o cliente dos detalhes de implementação das classes derivadas.
1. O cliente é totalmente dissociado dos detalhes de implementação de classes
derivadas. criação polimórfica é agora possível.
Exemplo
O Factory Method define uma interface para criar objetos, mas deixa as subclasses
decidirem quais as classes instanciar.
prensas de moldagem por injecção demonstrar este padrão. Os fabricantes de brinquedos processo de
moldagem de plástico em pó de plástico, e injectar o plástico para dentro de moldes de formas desejadas. A
classe de brinquedo (carro, figura acção, etc.) é determinado pelo molde.
Factory Method | 53
2. Lista de controle
1. Se você tem uma hierarquia de herança que exerce polimorfismo,1. Se você tem uma hierarquia de herança que exerce polimorfismo,
considere adicionar uma capacidade de criação de polimórfica, definindo um
estático método de fábrica na classe base.estático método de fábrica na classe base.
2. Projetar os argumentos para o método de fábrica. Que qualidades ou2. Projetar os argumentos para o método de fábrica. Que qualidades ou
características são necessárias e suficientes para identificar a classe derivada correta
para instanciar?
3. Considere a concepção de um "pool de objetos" interno que permitirá que objetos3. Considere a concepção de um "pool de objetos" interno que permitirá que objetos
para ser reutilizado em vez de criado a partir do zero.
4. Considere fazer todos os construtores privado ou protegido.4. Considere fazer todos os construtores privado ou protegido.4. Considere fazer todos os construtores privado ou protegido.4. Considere fazer todos os construtores privado ou protegido.4. Considere fazer todos os construtores privado ou protegido.
Regras de ouro
aulas Abstract Factory são frequentemente implementadas com métodos de fábrica, mas
eles podem ser implementados usando Prototype.
Métodos de fábrica são geralmente chamados de dentro de métodos de modelo.
Factory Method: criação por meio de herança. Protótipo: criação por meio de
delegação.
Muitas vezes, projetos começam usando Factory Method (menos complicado, mais
personalizável, subclasses proliferam) e evoluir em direção Abstract 54 | Factory Method
3. Factory Method | 55
Fábrica, Protótipo, ou Builder (mais flexível, mais complexo) como o designer descobre onde
é necessária uma maior flexibilidade.
Prototype não requer subclassificação, mas exige uma operação de inicialização.
Factory Method requer subclassificação, mas não exige Inicializar.
A vantagem de um método de fábrica é que ele pode retornar a mesma instância várias vezes,
ou pode retornar uma subclasse em vez de um objeto desse tipo exato.
Alguns defensores método de fábrica recomendamos que por uma questão de design de
linguagem (ou na sua falta, por uma questão de estilo) absolutamente todos os construtores deve
ser privada ou protegida. É um negócio de mais ninguém se uma classe fabrica um novo objeto ou
recicla um antigo.
o Novo operador considerado nocivo. Há uma diferença entre o pedido de um objeto eo Novo operador considerado nocivo. Há uma diferença entre o pedido de um objeto eo Novo operador considerado nocivo. Há uma diferença entre o pedido de um objeto e
criar um. o Novo operador sempre cria um objeto, e não para encapsular a criação docriar um. o Novo operador sempre cria um objeto, e não para encapsular a criação docriar um. o Novo operador sempre cria um objeto, e não para encapsular a criação do
objeto. Um método de depósito impõe que o encapsulamento, e permite que um objecto a
ser solicitado sem acoplamento indissolúvel ao acto de criação.
4. 56 | flyweight
flyweight
Intenção
• Usar compartilhamento para suportar um grande número de objetos de grão fino de forma eficiente.
• A estratégia Motif GUI de substituir peso-pesado widgets com aparelhos leves.
Problema
Projetar objetos para baixo para os níveis mais baixos do sistema de "granularidade" fornece
flexibilidade ideal, mas pode ser inaceitavelmente caro em termos de desempenho e uso de
memória.
Discussão
O padrão Flyweight descreve como compartilhar objetos para permitir seu uso em granularities
finas sem custos proibitivos. Cada objecto "contrapeso" é dividido em duas partes: a parte
dependente do estado (extrínseca), e a parte independente do estado (intrínseco). estado intrínseco é
armazenado (compartilhado) no objeto Flyweight. estado extrínseco é armazenado ou calculados
pelos objetos do cliente, e passado para o Flyweight quando suas operações são invocadas.
Uma ilustração dessa abordagem seria widgets do Motif que foram re-engenharia, como
aparelhos leves. Considerando os widgets são "inteligentes" o suficiente para estar no seus
próprios; existem dispositivos em uma relação de dependência com seu widget gerenciador de
layout pai.
Cada gerenciador de layout proporciona um comportamento dependente do contexto de eventos, gestão
imobiliária e serviços de recursos para seus dispositivos flyweight, e cada gadget é apenas responsável por
estado e comportamento independente do contexto.
Estrutura
Contrapesos são armazenados no repositório de uma fábrica. O cliente restringe-se
de criar contrapesos diretamente, e solicita-los do
5. Fábrica. Cada Flyweight não pode ficar em sua própria. Todos os atributos que tornam o
compartilhamento impossível deve ser fornecido pelo cliente sempre que é feita uma solicitação do
Flyweight. Se o contexto presta-se a "economia de escala" (ou seja, o cliente pode facilmente
calcular ou olhar-se os atributos necessários), então o padrão Flyweight oferece alavancagem
apropriada.
o Formiga, Gafanhoto, e Barata classes podem ser leveo Formiga, Gafanhoto, e Barata classes podem ser leveo Formiga, Gafanhoto, e Barata classes podem ser leveo Formiga, Gafanhoto, e Barata classes podem ser leveo Formiga, Gafanhoto, e Barata classes podem ser leveo Formiga, Gafanhoto, e Barata classes podem ser leveo Formiga, Gafanhoto, e Barata classes podem ser leve
porque seu estado específico da instância tem sido de-encapsulado, ou exteriorizada, e
devem ser fornecidos pelo cliente.
flyweight | 57
6. Exemplo
A Mosca usa compartilhamento para suportar grandes quantidades de objetos de forma eficiente.
A rede pública de telefonia comutada é um exemplo de uma Flyweight. Existem vários recursos,
como geradores de tom de discagem, geradores de toque, e receptores de dígitos que devem ser
compartilhadas entre todos os assinantes. Um assinante não tem conhecimento de quantos recursos
estão na piscina quando ele ou ela levanta o fone para fazer uma chamada. Tudo o que importa para os
assinantes é que um tom de discagem é fornecido, dígitos são recebidos, e a chamada é completada.
Lista de controle
1. Garantir que objeto sobrecarga é um problema que necessita de atenção, e, a1. Garantir que objeto sobrecarga é um problema que necessita de atenção, e, a
cliente da classe é capaz e disposto a absorver responsabilidade realinhamento.
2. Divide estado da classe alvo em: estado shareable (intrínseco), e2. Divide estado da classe alvo em: estado shareable (intrínseco), e
não-shareable (extrínseca) estado.
3. Retire o estado não-compartilháveis dos atributos de classe e adicioná-lo3. Retire o estado não-compartilháveis dos atributos de classe e adicioná-lo
a lista de argumentos chamando de métodos afetadas.
4. Criar uma fábrica que pode armazenar em cache e reutilizar instâncias de classe existentes.4. Criar uma fábrica que pode armazenar em cache e reutilizar instâncias de classe existentes.
5. O cliente deve usar a fábrica em vez do novo operador5. O cliente deve usar a fábrica em vez do novo operador
Pedido de objetos.
6. O cliente (ou um terceiro) deve olhar-para cima ou para calcular a não-6. O cliente (ou um terceiro) deve olhar-para cima ou para calcular a não-
Estado compartilhável, e da oferta que o estado de métodos de classe.
58 | flyweight