Паттерн "Фабрика" — это один из паттернов, который помогает создавать объекты. По сути, это удобный шаблон, который мы можем использовать в коде. И оказывается, что существует несколько способов создать объект с одинаковым названием "Фабрика". Один из них достаточно простой и мы его везде используем, а второй уже посложнее, но как раз он описан в книге банды четырех.
Фабричный объект: мы делаем отдельный класс, который позволит нам добавлять новые объекты определенного типа, не задевая остальной код. И в этом случае создание будет в одном файлике и у нас не будет дублирования. Я это представляю себе так: у нас есть котики Барсик, Персик и Кейма. Мы можем в нужных местах самостоятельно создавать и вызывать котиков. Но в какой-то момент котиков может стать слишком много и они все будут разбросаны по разным местам. Поэтому изначально можно создать некий кошачий дом. И в нужных местах везде обращаться к этому кошачьему дому и просить позвать нужного котика. Тогда, если появится новый котик, то мы просто поместим его в дом к другим котам и всё. Выглядит это как-то так:
Если вы используете фрагменты, то наверняка помните, что там тоже создается фабрика для создания. Вот это как раз этот паттерн. Просто и красиво :)
Фабричный метод — тут делается не отдельный класс, где живут все котики, а отдельный метод для создания. Я нарисовала схемку с котиками (заодно зацените мои новые навыки UML):
Выглядит намного сложнее, чем просто создать фабричный класс. Немного напоминаний про UML: курсив — это abstract. Пустая стрелочка — это наследование.
Тут у нас есть интерфейс для создания объектов (у меня это абстрактный класс CatFactory с абстрактным методом create). И от него наследуются NormalCatFactory и SmartCatFactory. В отличии от предыдущего способа, тут мы разделяем всех котиков по типу, а не совмещаем: умные котики будут в одной фабрике, нормальные котики в другой. Также, можно не делать NormalCatFactory и SmartCatFactory, а сразу наследоваться от CatFactory в нужном месте (например, внутри BarsikFragment). Потом мы переопределяем метод create уже внутри класса и создаем котика. Плюс в том, что у нас есть некий общий интерфейс, но все наследники самостоятельно решают какой им нужен котик.
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes