Шаблоны проектирования по-человечески: 6 порождающих паттернов, которые упростят жизнь

2
26797
Добавить в избранное

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

Порождающие паттерны

Осторожно!

  • шаблоны проектирования – не панацея от всех бед;
  • не пытайтесь переусердствовать, в противном случае решение проблем превратится в первопричину этих проблем;
  • использовать паттерны проектирования нужно в правильном месте и в правильном порядке.

Основная классификация

Каждый из типов рассчитан на конкретный круг задач, а делятся паттерны на:

  1. Порождающие паттерны.
  2. Структурные.
  3. Поведенческие.

Порождающие паттерны

Порождающие паттерны

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

В свою очередь, порождающие паттерны делятся на:

  1. Simple Factory
  2. Factory Method
  3. Abstract Factory
  4. Builder
  5. Prototype
  6. Singleton

1. Паттерн Simple Factory

Предположим, вы строите дом, и вам необходим проход. Было бы глупо всякий раз, когда нужна дверь, облачаться в одежду плотника, чтобы мастерить ее. Вместо этого вы получаете дверь с «завода».

Паттерн предназначен для инкапсуляции процесса образования объектов с помощью отдельного класса. «Простая Фабрика» удобна, но за простоту приходится платить: привязка к конкретной реализации исключает гибкость системы. Simple Factory следует использовать только там, где архитектура не будет изменяться.

Допустим, у нас есть интерфейс двери:

Далее появляется завод, который изготавливает дверь и возвращает ее нам:

И только после этого мы можем воспользоваться нашей дверью:

2. Паттерн Factory Method

Но порождающие паттерны на этом не заканчиваются. Шаблон проектирования Factory Method работает с полиморфизмом. В главном классе задается интерфейс, а реализация определяется уже подклассами.

Допустим, у нас есть интерфейс соискателя:

Теперь создаем менеджера по подбору персонала:

Предоставляем необходимого соискателя:

После чего можно использовать:

3. Паттерн Abstract Factory

Вернемся к примеру из Simple Factory. Может понадобиться деревянная дверь, металлическая или пластиковая. Разные типы дверей поставляются из разных магазинов, да и специалисты должны быть соответствующие: плотник, сварщик и т. д. Нам нужна «Абстрактная Фабрика», которая объединяет разные, но связанные фабрики без указания их конкретных классов.

Есть интерфейс двери и некоторые этапы реализации для нее :

Получаем экспертов для каждого типа дверей:

Имеем ту самую Abstract Factory для создания семейства объектов:

Используем:

4. Паттерн Builder

Вы зашли в ресторан быстрого питания, заказали гамбургер, и вам его приготовили. Но представьте, что нужно индивидуальное приготовление с определенным хлебом, соусом, сыром и т. д. Здесь поможет шаблон «Строитель», который отвечает за процесс поэтапного создания объекта.

У нас есть желаемый гамбургер:

Применяем конструирование:

Используем:

5. Паттерн Prototype

Помните Долли? Овцу, которую клонировали. Порождающие паттерны «Прототип» — это именно о клонировании.

В PHP это легко реализовать, используя clone:

После можно приступать к клонированию, как показано ниже:

6. Паттерн Singleton

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

Сделайте конструктор закрытым, отключите клонирование, расширение и создайте статическую переменную для экземпляра:

Используем:

 

Также рекомендуем Вам посмотреть:

Шаблоны проектирования по-человечески: структурные паттерны
Шаблоны проектирования по-человечески: поведенческие паттерны в примерах
Лучший видеокурс по шаблонам проектирования
4 лучших книг о шаблонах проектирования
20 полезных навыков, которые можно освоить за 3 дня

Хотите получать больше интересных материалов с доставкой?

Подпишитесь на нашу рассылку:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Комментариев: 2

  1. Николай

    для приготовления бургера, лучше обойти все в цикле, ведь мы не знаем что закажет каждый посетитель(исправлено):
    public function __construct(BurgerBuilder $builder)
    {
    foreach ($builder as $k=>$item)
    {
    $this->$k = $item;
    }

    return $this;
    }

Добавить комментарий