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