Что отличает Abstract Factory от обычной фабрики?
Abstract Factory создаёт семейство связанных объектов, согласованных между собой, так что клиент не смешает объекты разных семейств. Одна фабрика одного продукта — это ещё не Abstract Factory.
- JDK: java.sql.Connection порождает Statement, PreparedStatement, Blob одной СУБД
- DocumentBuilderFactory, TransformerFactory — выбор реализации XML
- Цена — новый вид продукта требует правки всех фабрик
А ещё Пример из UI: тема оформления создаёт согласованные кнопки, поля, меню
Подробно
Abstract Factory даёт согласованный набор: java.sql.Connection порождает Statement, PreparedStatement и Blob одной и той же СУБД, смешать объекты разных драйверов нельзя. Похоже устроены DocumentBuilderFactory и TransformerFactory. Цена паттерна — жёсткость: добавление нового вида продукта требует правки интерфейса фабрики и всех её реализаций.
Что хотят услышать
- Семейство продуктов как ключевой признак.
- Пример и цена.
Частые ошибки
- Называть Abstract Factory любую фабрику с интерфейсом.
- Забывать про минус: паттерн хорош, когда меняются семейства, и плох, когда меняется состав продуктов.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Она объявлена абстрактным классом, а не интерфейсом
- ✓Создаёт семейства связанных объектов, не давая смешать семейства
- ✗Она создаёт объекты только через рефлексию по имени класса из конфигурации
- ✗Она всегда возвращает синглтон
Что спросят дальше
- Что такое FactoryBean в Spring и как получить сам FactoryBean, а не его продукт?
- Чем Abstract Factory отличается от Factory Method?
Разбор темы
- Порождающие паттерны
Factory Method против статической фабрики Блоха, Abstract Factory, Builder в двух версиях, Prototype и почему clone() считают ошибкой, object pool — с примерами из JDK и Spring.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.