O documento descreve três padrões de projeto criacionais: Factory Method, Abstract Factory e Prototype. Factory Method fornece uma interface para criar objetos em uma superclasse, permitindo que subclasses alterem o tipo de objetos criados. Abstract Factory permite produzir famílias de objetos relacionados sem especificar classes concretas. Prototype permite copiar objetos existentes sem depender de suas classes.
1. Design Patterns creational
padrões de criação fornecer vários mecanismos de criação de objetos, o que aumenta
a flexibilidade e reutilização de código existente.
Factory
Method
Fornece uma interface para criar objetos em uma superclasse, mas permite que
subclasses de alterar o tipo de objetos que serão criados.
Abstract
Factory
Permite produzir famílias de objetos relacionados sem especificar suas classes
concretas.
69 padrões de criação design
2. Construtor
Permite construir objectos complexos passo a passo. O padrão permite produzir
diferentes tipos e representações de um objeto usando o mesmo código de
construção.
Protótipo
Permite copiar objetos existentes sem fazer o seu código dependente de suas
classes.
coisa única
Permite garantir que uma classe tem apenas uma instância, ao fornecer um ponto de
acesso global a esta instância.
70 padrões de criação design
3. MÉTODO DE FÁBRICA
Também conhecido como: Construtor Virtual
Factory Method é um padrão de projeto criacional que fornece uma interface paraFactory Method é um padrão de projeto criacional que fornece uma interface para
criar objetos em uma superclasse, mas permite que subclasses de alterar o tipo
de objetos que serão criados.
71 Criacionais Design Patterns / método de fábrica
4. Problema
Imagine que você está criando um aplicativo de gerenciamento de logística. A primeira
versão do seu aplicativo só pode lidar com o transporte por caminhões, por isso a maior
parte do seu código vive no interior do
Caminhão classe.Caminhão classe.
Depois de um tempo, a sua aplicação torna-se muito popular. Cada dia você receber
dezenas de pedidos de empresas de transporte marítimo para incorporar logística mar
no aplicativo.
Adicionando uma nova classe para o programa não é tão simples se o resto do código
já está acoplado a classes existentes.
Grande notícia, certo? Mas como sobre o código? Actualmente, a maioria do seu código
é acoplado ao Caminhão classe. adicionando navios no aplicativo exigiria fazer alterações emé acoplado ao Caminhão classe. adicionando navios no aplicativo exigiria fazer alterações emé acoplado ao Caminhão classe. adicionando navios no aplicativo exigiria fazer alterações emé acoplado ao Caminhão classe. adicionando navios no aplicativo exigiria fazer alterações emé acoplado ao Caminhão classe. adicionando navios no aplicativo exigiria fazer alterações em
toda a base de código. Além disso, se mais tarde você decidir adicionar outro tipo de
transporte para o aplicativo, você provavelmente terá que fazer todas essas mudanças
novamente.
•
72 Criacionais Design Patterns / método de fábrica
5. Como resultado, você vai acabar com código bastante desagradável, cheio de condicionais
que mudar o comportamento do aplicativo, dependendo da classe de objetos de transporte.
Solução
O padrão Factory Method sugere que você substituir chamadas construção do objeto direto
(usando o Novo operador) com chamadas para um especial fábrica método. Não se(usando o Novo operador) com chamadas para um especial fábrica método. Não se(usando o Novo operador) com chamadas para um especial fábrica método. Não se(usando o Novo operador) com chamadas para um especial fábrica método. Não se(usando o Novo operador) com chamadas para um especial fábrica método. Não se
preocupe: os objetos ainda são criados através da Novo operador, mas ele está sendopreocupe: os objetos ainda são criados através da Novo operador, mas ele está sendopreocupe: os objetos ainda são criados através da Novo operador, mas ele está sendo
chamado de dentro do método de fábrica. Objetos retornados por um método de fábrica são
muitas vezes referidos como “produtos”.
Subclasses pode alterar a classe de objetos que estão sendo devolvidos pela
método de fábrica.
À primeira vista, essa mudança pode parecer inútil: que acabou de se mudar a chamada
do construtor de uma parte do programa para outro. No entanto, considere o seguinte:
agora você pode substituir o método de fábrica em uma subclasse e alterar a classe de
produtos que está sendo criado pelo método.
•
73 Criacionais Design Patterns / método de fábrica
6. Há uma ligeira limitação porém: subclasses pode retornar diferentes tipos de
produtos se estes produtos têm uma classe base comum ou interface. Além disso,
o método de fábrica na classe base deveria ter seu tipo de retorno declarado
como esta interface.
Todos os produtos devem seguir a mesma interface.
Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,Por exemplo, tanto Caminhão e Navio classes devem implementar o Transporte interface,
que declara um método chamado entregar. Cada classe implementa este método deque declara um método chamado entregar. Cada classe implementa este método deque declara um método chamado entregar. Cada classe implementa este método de
forma diferente: caminhões entregar a carga por terra, navios entregar a carga
por mar. O método de fábrica na RoadLogistics classe retorna objetos de caminhões,por mar. O método de fábrica na RoadLogistics classe retorna objetos de caminhões,por mar. O método de fábrica na RoadLogistics classe retorna objetos de caminhões,
enquanto o método de fábrica na SeaLogisticsenquanto o método de fábrica na SeaLogistics
classe retorna navios.
O código que utiliza o método de fábrica (muitas vezes chamado de clienteO código que utiliza o método de fábrica (muitas vezes chamado de cliente
O código) não vê uma diferença entre os produtos reais retornados por
várias subclasses. O cliente trata todos os produtos como abstrato Transporte.várias subclasses. O cliente trata todos os produtos como abstrato Transporte.
74 Criacionais Design Patterns / método de fábrica
7. Enquanto todas as classes de produtos implementar uma interface comum, você pode passar
seus objetos para o código do cliente sem quebrá-lo.
O cliente sabe que todos os objetos de transporte devem ter o entregar método,O cliente sabe que todos os objetos de transporte devem ter o entregar método,O cliente sabe que todos os objetos de transporte devem ter o entregar método,
mas exatamente como ele funciona não é importante para o cliente.
Estrutura•
75 Criacionais Design Patterns / método de fábrica
8. 1. A produtos declara a interface, que é comum a todos1. A produtos declara a interface, que é comum a todos1. A produtos declara a interface, que é comum a todos
objetos que podem ser produzidos pelo criador e suas subclasses.
2. produtos de concreto são diferentes implementações da produ-2. produtos de concreto são diferentes implementações da produ-2. produtos de concreto são diferentes implementações da produ-
interface de UCT.
3. A O Criador classe declara o método de fábrica que retorna3. A O Criador classe declara o método de fábrica que retorna3. A O Criador classe declara o método de fábrica que retorna
novos objetos produtos. É importante que o tipo de retorno desse método coincide
com a interface do produto.
Você pode declarar o método de fábrica como abstrata para forçar todas as subclasses
para implementar as suas próprias versões do método. Como alternativa, o método de
fábrica base pode retornar algum tipo de produto padrão.
Note, apesar do seu nome, a criação do produto é não a responsabilidade primária doNote, apesar do seu nome, a criação do produto é não a responsabilidade primária doNote, apesar do seu nome, a criação do produto é não a responsabilidade primária do
criador. Normalmente, a classe criador já tem alguma lógica do núcleo de negócios
relacionados aos produtos. O método de fábrica contribui para dissociar essa lógica das
classes de produtos concretos. Aqui está uma analogia: uma grande empresa de
desenvolvimento de software pode ter um departamento de formação para
programadores. No entanto, a função principal da empresa como um todo ainda está
escrevendo código, não produzindo programadores.
4. Criadores de concreto substituir o método fábrica de base para que ele4. Criadores de concreto substituir o método fábrica de base para que ele4. Criadores de concreto substituir o método fábrica de base para que ele
retorna um tipo diferente de produto.
76 Criacionais Design Patterns / método de fábrica