FactoryMethod Flashcards
Intenção
Factory Method é um design pattern criacional que provê uma interfaca para criação de objetos em um superclasse, mas permite que subclasses alterem o tipo dos objetos que serão criados
Estrutura
Produto
Produtos Concretos
Criador
Criadores Concretos
Estrutura: Produto
declara a interface única para todos objetos que serão produzidos pelo Criados e suas subclasses
Estrutura: Produtos Concretos
São as diferentes implementações da interface Produto.
Criadores Concretos irão criar e retornar essas classes
Estrutura: Criador
declara o factory method que retorna os Produtos Concretos.
Esse método pode ser abstrato ou ter um comportamento padrão.
Estrutura: Criadores Concretos
Implementa ou sobreescreve o factory method base, por criar e retornar um dos produtos concretos.
Como pode ser útil quando:
Você não sabe os tipos exatos e dependencias dos objetos.
O Factory method pode esconder os detalhes de implementação de um produto para outro.
Para criar um novo tipo de produto você só precisa criar uma nova subclasse e sobreescrever o factory method nela.
Como pode ser útil quando:
Você quer fornecer aos usuários de sua biblioteca ou framework uma forma de alterar (por extensão) os componentes internos.
Um usuário pode facilmente sobreescrever um componente, mas como o framework reconheceria essa classe?
O factory method não fornece apenas um meio de extender os componentes, mas também reduzir o código que produz esses componentes para apenas um método.
Como pode ser útil quando:
Quando você quer economizar recurso computacional reutilizando objetos existentes ao invés de criar novos.
O processo de reutilização de objetos exige uma certa complexidade: criar um pool para os objetos existentes, verificar o pool, ver se o objeto já existe e decidir se deve ser criado um novo ou não.
Um factory method já deixa essa lógica implementada para todos os objetos que serão criados.
Como refatorar para Factory Method
- Extrair a interface comum para todos Produtos. Essa interface deve declarar métodos que fazem sentido para todos os produtos.
- Adicione um factory method vazio dentro da classe criadora. A sua assinatura deve retornar a interface extraida.
- Percorra todas as referências à criação de produtos troque as chamadas de criação.
Você precisaria adicionar um parâmetro temporário que será usado para controlar quais produtos serão criados. - Sobreescreva o factory method em subclasses e mova cada lógica de criação para a subclasse relativa.
- O parâmetro usado na classe de criação básica pode ser usado nas subclasses.
- Se o factory method ficar vazio, você pode declará-lo abstrato.
Quando refatorar para FactoryMethod?
Quando a lógica de criação de objetos está muito acoplada em uma única classe.
Pros
- Segue o Open/Closed Principle
- Evita muito acoplamento entre os Produtos Concretos e as classes que os utilizam
- Simplifica o código de criação para apenas um lugar
- Simplifica a adição de novos produtos
Cons
Requer subclasses extras.