В чем разница фабрики, абстрактной фабрики и фабричного метода
Что проверяют
Различаете ли вы три похожих названия: одно из них обозначает простой приём, два других это паттерны GoF с разной структурой. Следом просят пример из Android, и тут видно, понимаете ли вы паттерн или только помните определение.
Как отвечать
Разведите понятия:
- простая фабрика (Simple Factory): класс или функция с
whenпо параметру, которая возвращает нужную реализацию. В каталоге GoF её нет, это идиома. В Kotlin её часто оформляют функцией вcompanion object; - фабричный метод (Factory Method): базовый класс объявляет абстрактный метод создания, а подклассы решают, какой объект вернуть. Остальная логика базового класса работает с продуктом через интерфейс и не знает конкретного типа. Держится на наследовании;
- абстрактная фабрика (Abstract Factory): интерфейс, который создаёт целое семейство связанных объектов. Подменили фабрику, и все объекты семейства поменялись согласованно. Держится на композиции: фабрику передают объекту снаружи.
Примеры из Android, которые стоит назвать:
ViewModelProvider.Factory: вы реализуетеcreate(), а фреймворк зовёт его, когда нужен экземпляр. Так передают зависимости вViewModelбез Hilt;LayoutInflater.Factory2: перехват созданияViewпри инфлейте. Через него AppCompat подменяет стандартные виджеты своими версиями;- абстрактная фабрика на практике: набор из клиента, маппера и логгера для разных платёжных провайдеров или для тестовой и боевой сборки.
Добавьте, что в современных проектах часть этих задач берёт на себя DI: модуль Hilt с методами @Provides по сути и есть фабрика, а связывание за вас генерирует компилятор.
Где спотыкаются
Называют фабричным методом статический newInstance() у фрагмента. Это статический фабричный метод из «Effective Java», то есть именованный конструктор, а не паттерн GoF с подклассами.
Описывают абстрактную фабрику как «фабрику, которая создаёт много разных объектов». Ключевое слово здесь семейство: объекты должны сочетаться между собой, и фабрика не даёт смешать детали из разных наборов.
Не могут сказать, когда паттерн лишний. Если реализация одна и меняться не будет, фабрика добавляет только слой абстракции.