Definindo:
Classe Mãe:
Pizza
Classes Filhas:
PizzaDiet
PizzaNormal
Classes de composição (eu que dei esse nome):
Massa
Recheio
Interfaces:
IMassa
IRecheio
Fabricante:
Fabrica
FabricaPizzaDiet
FabricaPizzaNormal
Na construção sem factory
- Acoplado
- Classes de composição: construtor, gettings e settings
- Classe mãe: construtor, gettings e settings
- Construtor sem parâmetros e inicializa os atributos com new (composição)
- O Teste: instancia a classe mãe.
- Desacoplado
- Classes de composição: construtor, gettings e settings
- Classe mãe: construtor, gettings e settings, construtor recebe parâmetros e inicializa os atributos com os parâmetros (agregação simples)
- Classe Teste: instancia as classes de composição e também a classe mãe, passando as classes de composição como parâmetros para a criação da classe mae.
- Factory Method
- Cria-se um pacote para interfaces
- Para cada classe de composição, cria-se uma interface
- Cria-se pacotes para cada agrupamento de classes de composição
- Cada classe de composição implementa a sua própria interface
- As classes de composição são concretas e possuem seus próprios construtores
- A classe mãe passa a ser abstrata
- Os atributos da classe mãe que é do tipo da classe de composição, passa a ser do tipo Interface
- No construtor da classe mae, os atributos do tipo Interface recebem os métodos de criacao (factoryMethod): atributo = criaClasse()
- Na classe mãe, também são definidos os métodos de criação
- Esses métodos de criação são abstratas e retornam uma Inteface
- A implementação dos métodos de criação só ocorre nas classes filhas
- Na classe teste é criado um objeto do tipo da classe mãe e então pode-se instanciar qualquer classe filha.
- Abstract Factory
- Cria-se uma classe abstrata fabricante que vai conter os a definição dos métodos de criação (abstratos) que estavam na classe mãe
- As classes filhas agora serão filhas do fabricante e será acrescentado o singleton em cada uma delas. Não esquecer que o método de criação é publico e static e o construtor privado
- A classe mãe passa a ser concreta (não abstrata)
- O construtor da classe mãe receberá como parâmetro uma fabrica e atribuição dos valores do atributos serão dos métodos de criação dessa fabrica. Ex: (this.massa = fabrica.criaMassa(100))
- Na classe teste será criado um objeto do tipo fabrica instanciando a fabrica filha e este será parâmetro para a criação da classe mãe.