Abstract Factory

Descrição:

Abstract Factory é um padrão de projeto que provê uma interface para criação de famílias de objetos relacionados ou dependentes sem que necessite especificar suas classes concretas.

Diagrama de Classes genérico do padrão:

<Imagem do UML padrão do Abstract Factory>

Exemplo:

Em uma situação hipotética, uma pizzaria abre lojas por todo o país, mas vê que pizzas de um mesmo sabor são produzidas com ingredientes diferentes em cada região. Assim, para manter a qualidade, cria-se, para cada região, uma fábrica que prepara as pizzas nos padrões regionais. Isto é, para cada região, cria-se uma classe filha da classe abstrata PizzaIngredientFactory que produz os ingredientes da região.

Neste exemplo, a pizza é composta de quatro ingredientes:

A fábrica de ingredientes de Nova York (NyIngredientFactory) produz os seguintes tipos de ingrediente para suas pizzas:

A fábrica de ingredientes de Chicago (ChicagoIngredientFactory) produz, entretanto, outras variações dos ingredientes:

Como as duas fábricas produzem os mesmos tipos de ingrediente para compor a pizza, então a classe abstrata PizzaIngredientFactory é utilizada para definir os métodos comuns das duas fábricas:

Como a definição dos métodos exige um tipo específico de retorno que pode ser tanto a variação do ingrediente de NY quanto de Chicago, vê-se necessário a implementação de classes abstratas para cada um dos ingredientes, para que suas variações possam herdar a característica em comum - ser uma variação do mesmo ingrediente. (Por exemplo, FreshClams e FrozenClams são ambos filhos de Clams)

Assim, cada ingrediente pode ter vários filhos, que são suas variações, e cada fábrica que herdar de PizzaIngredientFactory estará livre para usar qualquer variação do ingrediente.

O último passo é utilizar o método create_pizza() da classe PizzaStore. Esse método criará uma pizza, que pode ser composta por qualquer combinação de variações de ingredientes, utilizando os métodos de uma das fábricas definidas. Por exemplo, se a loja quiser produzir uma pizza estilo NY, ela criará um objeto do tipo NyIngredientFactory e chamará cada um dos métodos de criação de ingrediente, adicionando cada um dos ingredientes produzidos à pizza. Após isso, ela estará pronta para ser utilizada.

Diagrama de Classes do exemplo:

<Imagem do Exemplo sobre Abstract Factory no livro>

Ver código fonte no Github