Найти в Дзене
AniNice

Паттерн: Фабричный метод

Суть паттерна Фабричный метод - это порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в супер-классе, позволяя подклассам изменять тип создаваемых объектов. Паттерн "Фабричный метод" предлогает создавать объекты не напрямую, используя оператор new, а через вызов особого фабричного метода. Не пугайтесь, объекты все равно будут создаваться при помощи new, но делать это будет фабричный метод. На первый взгляд, это может показать бессмысленным: мы просто переместили вызов конструктора из одного конца программы в другой. Но теперь вы сможете переопределить фабричный метод в подклассе, чтобы изменить тип создаваемого продукта. Чтобы эта система заработала, все возвращаемые объекты должны иметь общий интерфейс. Подклассы смогут производить объекты различных классов, следующих одному и тому же интерфейсу. Применимость Когда заранее неизвестны типы и зависимости объектов, с которыми должен работать ваш код. Фабричный метод отделяет код производства пр
Оглавление

Суть паттерна

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

Паттерн "Фабричный метод" предлогает создавать объекты не напрямую, используя оператор new, а через вызов особого фабричного метода. Не пугайтесь, объекты все равно будут создаваться при помощи new, но делать это будет фабричный метод.

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

Чтобы эта система заработала, все возвращаемые объекты должны иметь общий интерфейс. Подклассы смогут производить объекты различных классов, следующих одному и тому же интерфейсу.

Применимость

Когда заранее неизвестны типы и зависимости объектов, с которыми должен работать ваш код.

Фабричный метод отделяет код производства продуктов от остального кода, который эти продукты использует.

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

Когда вы хотите дать возможность пользователям расширять части вашего фреймворка

Пользователи могут расширять классы вашего фреймворка через наследование. Но как сделать так, чтобы фреймворк создал объекты из этих новых классов, а не из стандартных?

Решением будет дать пользователям возможность расширять не только желаемые компоненты, но и классы, которые создают эти компоненты. А для этого создающие классы должны иметь конкретные создающие методы, которые можно определить.

Когда вы хотите экономить системные ресурсы, повторно используя уже созданные объекты, вместо порождения новых.

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

Шаги реализации

  1. Приведите все создаваемые продукты в общему интерфейсу
  2. В классе, которые производит продукты, создайте пустой фабричный метод. В качестве возвращаемого типа укажите общий интерфейс продукта.
  3. Затем пройдитесь по коду класса и найдите все участки, создающие продукты. Поочередно замените эти участки вызовами фабричного метода, перенося в него код создания различных продуктов.
  4. Для каждого типа продуктов заведите подкласс и переопределите в нем фабричный метод. Переместите туда код создания соответствующего продукта из суперкласса.
  5. Если создаваемых продуктов слишком много для существующих подклассов создателя, вы можете подумать о введении параметров в фабричный метод, которые позволят возвращать различные продукты в пределах одного подкласса.
  6. Если после всех перемещений фабричный метод стал пустым, можете создать его абстрактным. Если в нем что-то осталось - не беда, это будет его реализаций по умолчанию.