O método Factory geralmente é categorizado por uma instrução switch em que cada caso retorna uma classe diferente, usando a mesma interface raiz para que o código de chamada nunca precise tomar decisões sobre a implementação.
Pense em uma fábrica de validadores de cartão de crédito que retorne um validador diferente para cada tipo de cartão.
public ICardValidator GetCardValidator (string cardType)
{
switch (cardType.ToLower())
{
case "visa":
return new VisaCardValidator();
case "mastercard":
case "ecmc":
return new MastercardValidator();
default:
throw new CreditCardTypeException("Do not recognise this type");
}
}
O Abstract Factory é onde você tem várias classes de fábrica concretas (não Métodos de Fábrica) derivadas de uma interface que pode retornar muitos tipos diferentes de métodos diferentes.
Pense em um gerente de jogos de xadrez com uma classe diferente para cada conjunto de regras variantes.
public class StandardChessRulesFactory : IChessRulesFactory
{
public IBoardMapper GetBoardMapper()
{
return new StandardChessBoardMapper();
}
public IKingMover GetKingMover()
{
return new StandardChessKingMover();
}
public IMoveClock GetMoveClock()
{
return new StandardMoveClock();
}
}
public class HexagonalChessRulesFactory : IChessRulesFactory
{
public IBoardMapper GetBoardMapper()
{
return new HexagonalChessBoardMapper();
}
public IKingMover GetKingMover()
{
return new HexagonalChessKingMover();
}
public IMoveClock GetMoveClock()
{
return new StandardMoveClock();
}
}
public class SpeedChessRulesFactory : IChessRulesFactory
{
public IBoardMapper GetBoardMapper()
{
return new StandardChessBoardMapper();
}
public IKingMover GetKingMover()
{
return new StandardChessKingMover();
}
public IMoveClock GetMoveClock()
{
return new SpeedChessMoveClock();
}
}
Uma Fábrica Abstrata, bem como uma Estratégia, é freqüentemente selecionada usando um Método de Fábrica, mas não é necessário combiná-las, para que seja seu próprio padrão.