El Método de Fábrica generalmente se clasifica por una declaración de cambio donde cada caso devuelve una clase diferente, usando la misma interfaz raíz para que el código de llamada nunca necesite tomar decisiones sobre la implementación.
Piense en una fábrica de validadores de tarjetas de crédito que devuelve un validador diferente para cada tipo de tarjeta.
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");
}
}
La Fábrica abstracta es donde tiene múltiples clases de fábrica concretas (no Métodos de fábrica) derivadas de una interfaz que puede devolver muchos tipos diferentes de diferentes métodos.
Piense en un administrador de juegos de ajedrez con una clase diferente para cada conjunto de reglas 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();
}
}
Una Fábrica abstracta, al igual que una Estrategia, a menudo se selecciona utilizando un Método de fábrica, pero no es necesario combinarlas, por lo que es su propio patrón.