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:

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:
- Massa (dough)
- Mexilhão (clams)
- Queijo (cheese)
- Molho (sauce)
A fábrica de ingredientes de Nova York (NyIngredientFactory) produz os seguintes tipos de ingrediente para suas pizzas:
- Massa de crosta fina (thin crost dough)
- Mexilhão fresco (fresh clams)
- Queijo Mussarela (mozzarella cheese)
- Molho de tomate (plum tomato sauce)
A fábrica de ingredientes de Chicago (ChicagoIngredientFactory) produz, entretanto, outras variações dos ingredientes:
- Massa de crosta grossa (thick crost dough)
- Mexilhão congelado (frozen clams)
- Queijo Reggiano (reggiano cheese)
- Molho Marinara (marinara sauce)
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:
- create_dough() - produz a massa
- create_clams() - produz o mexilhão
- create_cheese() - produz o queijo
- create_sauce() - produz o molho
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:

