Какой паттерн фабрики используется в Spring: абстрактная или обычная
Что проверяют
Различаете ли вы фабричный метод и абстрактную фабрику по сути, а не по названию, и видите ли их в самом Spring. Следом часто спрашивают, чем BeanFactory отличается от FactoryBean, и это вопрос с подвохом.
Как отвечать
Сначала разведите понятия. Фабричный метод: создание объекта вынесено в отдельный метод, который можно переопределить или подменить. Абстрактная фабрика: интерфейс, который создаёт семейство связанных объектов, согласованных между собой (кнопка и окно одной темы, соединение и команда одной СУБД).
Дальше честный ответ: в Spring явно и повсеместно используется фабричный метод, а абстрактная фабрика в строгом смысле GoF центральной роли не играет. Где что видно:
@Bean-методы: каждый метод в@Configuration-классе это фабричный метод, контейнер вызывает его и регистрирует результат как бин. В XML то же делает атрибутfactory-method;FactoryBean<T>: интерфейс для сложного создания объектов, методgetObject()возвращает готовый продукт. Так устроеныLocalContainerEntityManagerFactoryBeanиProxyFactoryBean;BeanFactory: корневой интерфейс контейнера с реализациями вродеDefaultListableBeanFactoryи наследникомApplicationContext. Его иногда называют абстрактной фабрикой, потому что клиент работает с интерфейсом и не знает реализацию. Но создаёт он объекты любого типа по имени или типу, а не семейство продуктов, поэтому точнее назвать его универсальной фабрикой, на которой держится IoC.
Если спросят про семейства, приведите пример из прикладного кода: несколько реализаций одного интерфейса под разные профили или условия (@Profile, @ConditionalOnProperty). Задача та же, что у абстрактной фабрики, но решается конфигурацией.
Где спотыкаются
Путают BeanFactory и FactoryBean. Первое это контейнер, второе это бин, который сам производит другие объекты. Чтобы получить саму фабрику, а не её продукт, к имени добавляют &: getBean("&myFactory").
Приводят в пример XmlBeanFactory. Он устарел ещё в ветке 3.x, и ссылка на него выдаёт знания по старым статьям.
Отвечают одним словом без обоснования. Интервьюеру важнее, как вы отличаете паттерны, чем какой вариант вы назвали.