Các Phương pháp Factory thường được phân loại theo một tuyên bố chuyển đổi trong đó mỗi trường hợp trả về một lớp học khác nhau, sử dụng giao diện gốc tương tự để mã gọi không bao giờ cần phải đưa ra quyết định về việc thực hiện.
Hãy nghĩ về một nhà máy xác nhận thẻ tín dụng trả về một trình xác nhận khác nhau cho từng loại thẻ.
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");
}
}
Các Abstract Factory là nơi bạn có nhiều lớp nhà máy bê tông (không Factory phương pháp) có nguồn gốc từ một giao diện mà có thể trở lại nhiều loại khác nhau từ phương pháp khác nhau.
Hãy nghĩ về một người quản lý trò chơi cờ vua với một lớp khác nhau cho mỗi bộ quy tắc biến thể.
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();
}
}
Một Nhà máy Trừu tượng, giống như Chiến lược, thường được chọn bằng Phương thức Nhà máy, nhưng không nhất thiết phải kết hợp chúng để nó là mô hình của chính nó.