Factory Method e Abstract Factory

Olá pessoal,

Gostaria de saber quais são as vantagens e desvantagens entre as seguintes formas de implementação do padrão abstract factory:

public abstract class factory{ public abstract Automovel makeCaminhao(); public abstract Automovel makeCarro(); public abstract Automovel makeOnibus(); public abstract Automovel makeMoto(); }

e

[code]public abstract class factory{
public static final String CAMINHAO = "CAMINHAO";
public static final String CARRO = "CARRO";
public static final String ONIBUS = "ONIBUS";
public static final String MOTO = "MOTO";

public abstract Automovel makeAutomovel(String type);
}[/code]

Que tal…

interface VeiculoFactory { Veiculo create(); }

e…

[code]public class CaminhaoFactory implements VeiculoFactory {
public Veiculo create() { … }
}

public class BicicletaFactory implements VeiculoFactory {
public Veiculo create() { … }
}

…[/code]

AbstractFactory é mais interessante quando voce tem uma familia de produtos que seja fixa. Como vantagem menos classes vão ser criadas. Com o desvantagem elas serão mais acopladas.

FactoryMethod é preferivel quando a diversidade de produtos é muito diferente e não tem como classificá-los em algumas categorias. Como disvantagem mais classes serão criadas. Com vantagem elas serão menos acopladas.

Para AbstractFactory use o seu primeiro exemplo, para FactoryMethod use o do CV.

O seu segundo exemplo é o menos recomendado por que ele costuma levar a código spaghetti, ruim de manter e estender. Isso além de diminuir a tipagem forte do seu sistema.