Il Metodo di fabbrica viene solitamente classificato da un'istruzione switch in cui ogni caso restituisce una classe diversa, utilizzando la stessa interfaccia di root in modo che il codice chiamante non debba mai prendere decisioni sull'implementazione.
Pensa a una fabbrica di validatori di carte di credito che restituisce un validatore diverso per ogni tipo di carta.
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 Fabbrica astratta è il luogo in cui sono presenti più classi di fabbrica concreta (non metodi di fabbrica) derivate da un'interfaccia che può restituire molti tipi diversi da metodi diversi.
Pensa a un gestore di giochi di scacchi con una classe diversa per ogni serie di regole varianti.
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 Fabbrica astratta, molto simile a una Strategia, viene spesso selezionata usando un Metodo di Fabbrica, ma non è necessario combinarli in modo tale che sia il suo modello.