Фабричный метод. Как реализовать понятно, но зачем?
=====================================================

 Всем привет. Я понимаю как реализовать, не до конца понимаю смысл использования этого паттерна. Наверно я еще не работал в достаточно крупных проектах, где объясняется его применение. Из того что я понял о его использовании (поправьте или дополните):  

1) Мы убираем из клиентского кода процесс создания конкретных объектов, и прячем это за кулисами фабрики. Тем самым реализуем инкапсуляцию и принцип открытости-закрытости.  

2) Программа на этапе компиляции не знает, какие конкретные продукты будут использоваться, все запрограммировано в виде интерфейсов(базовых классов). Конкретные реализации будут в рантайме в зависимости от каких-то условий.  

3) Так как процесс создания конкретных объектов может быть довольно сложным и отличаться для разных классов, мы создаем дополнительную абстракцию в виде фабрики, в конкретных реализациях которой и будет происходить все это дело.  

4) Фабричный метод является основой для других порождающих паттернов. То есть когда не можешь определиться, какой из порождающих паттернов использовать для оптимизации кода, используй фабричный метод. 

 Например, в конфиге приложения указан тип базы в виде строки, а фабричный метод по этой строке выдает экземпляр класса для коннекта к БД, которому будет передаваться строка подключения в дальнейшем. 

 В книге Java. Эффективное программирование про это есть отличная статья