Фабричний метод , як правило , класифікуються за розподільчим заявою , де кожен випадок повертає інший клас, використовуючи той же самий кореневої інтерфейс , так що викликає код не повинен приймати рішення про реалізацію.
Придумайте фабрику валідатора кредитної картки, яка повертає різний валідатор для кожного типу картки.
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");
}
}
Abstract Factory , де у вас є кілька бетонних фабричних класів (НЕ фабричні методів) , отриманих з одного інтерфейсу , який може повертати безліч різних типів з різних методів.
Подумайте про менеджера шахових ігор з різним класом для кожного набору варіантів правил.
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();
}
}
Абстрактна фабрика, подібно до стратегії, часто вибирається за допомогою заводського методу, але поєднувати їх не потрібно, щоб це був власний зразок.