Сегодня мы поговорим о шаблонах проектирования, точнее, о шаблонах проектирования веб-приложений на PHP. Опытные разработчики вряд ли узнают много нового, но вот для новичков эта статья будет чрезвычайно полезна:
Так что же такое шаблоны проектирования? Шаблоны проектирования – это не аналитические шаблоны, не описание типичных структур данных вроде связных списков. Это также не правила, по которым строятся конкретные приложения или интерфейсы.
Фактически шаблоны проектирования являются «описанием взаимодействия объектов и классов, построенным с целью решения типичных задач проектирования в определённом контексте». Другими словами, шаблоны проектирования предоставляют набор подходов к решению каждодневных проблем.
Содержание
Шаблоны проектирования – это не библиотека или класс, которые можно было бы просто включить в имеющуюся систему, это не конкретный алгоритм, который можно было бы преобразовать в код.
Шаблоны проектирования – это нечто большее. Они описывают методы, при помощи которых может быть спроектирована программная система, решающая проблему определённого рода.
Шаблоны проектирования ускоряют разработку программ, поскольку представляют собой проверенные практикой решения, которые остаётся только воплотить в конкретной архитектуре. Более того, шаблоны проектирования упрощают понимание довольно сложных концепций.
Конечно же, необходимо проявлять осмотрительность в выборе шаблона проектирования для решения каждой конкретной проблемы. В дополнение к теории мы представим достаточно абстрактные, но вместе с тем простые примеры применения шаблонов проектирования на практике.
На сегодняшний день существует 23 шаблона проектирования, которые разделены на 3 группы в соответствии с их
назначением:
- порождающие шаблоны: используются для создания объектов, которые затем могут использоваться независимо от создавшей их системы;
- структурные шаблоны: объединяют в единую логическую структуру несвязанные друг с другом объекты;
- поведенческие шаблоны: управляют алгоритмами, отношениями и распределением обязанностей между разными программными объектами.
Ниже приведён полный список шаблонов проектирования:
Назначение | Название шаблона | Варьируемые аспекты |
Порождающие | Абстрактная фабрика (Abstract Factory) | Имена производимых объектов |
Строитель (Builder) | Соотношение частей сложных объектов | |
Фабричный метод (Factory Method) | Подкласс создаваемых объектов | |
Прототип (Prototype) | Класс создаваемых объектов | |
Одиночка (Singleton) | Класс имеет единственную инстанцию | |
Структурные | Адаптер (Adapter) | Интерфейс к объекту |
Мост (Bridge) | Реализация объекта | |
Компоновщик (Composite) | Структура и соотношение частей объекта | |
Декоратор (Decorator) или обёртка | Ответственность объекта того же класса | |
Фасад (Facade) | Интерфейс к подсистеме объекта | |
Приспособленец (Flyweight) | Подсистема хранения объекта | |
Заместитель (Proxy) | Место и способ обращения к объекту | |
Поведенческие | Цепочка ответственности (Chain of Responsibility) | Выбор объекта, способного выполнить данный запрос |
Команда (Command) | Время и способ выполнения запроса | |
Итератор (Iterator) | Порядок доступа к вложенным элементам | |
Посредник (Mediator) | Способ и порядок взаимодействия объектов друг с другом | |
Хранитель (Memento) | Какая частная информация класса хранится вне его, и когда | |
Наблюдатель (Observer) | Количество зависимых объектов и способ обновления их состояния | |
Состояние (State) | Состояние объектов | |
Стратегия (Strategy) | Выбор алгоритма | |
Шаблонный метод (Template Method) | Последовательность действий | |
Посетитель (Visitor) | Операции, осуществляемые с объектом, без изменения его класса |
А теперь расскажем подробнее о самых востребованных из перечисленных выше шаблонов (а также о некоторых не перечисленных).
Одиночка
Это ; один из самых популярных шаблонов. Часто во время проектирования сайта возникает потребность в обращении к единственной инстанции определённого класса на протяжении всего времени выполнения. Такое поведение класса и называется «Одиночка». Например:
Пул одиночек
В определённом случае может понадобиться обеспечить доступ к нескольким одиночкам в одном проекте:
Стратегия
Шаблон проектирования «Стратегия» имеет дело с алгоритмами. Реализуя его, вы инкапсулируете определённую группу алгоритмов так, чтобы порождённый класс мог воспользоваться ими, не зная ничего об их конкретной реализации. Например:
Декоратор
Этот шаблон подразумевает внедрение нового поведения (или уточнение уже имеющегося) в объект во время выполнения программы. Например:
Реестр
Этот шаблон не относится к порождающим, хотя в чём-то близок к ним. Реестр – это всего лишь хэш-таблица, а данные в ней могут быть получены при помощи обращения к статическому методу класса:
Фабрика
Это ещё один очень распространённый шаблон. Он делает именно то, что можно предположить, исходя из его названия: производит инстанции объектов.
Другими словами, представьте, что у вас есть настоящая фабрика, производящая некое изделие. Мы можем понятия не иметь, как именно фабрика производит это изделие, зато у нас есть универсальный способ заказать его:
Абстрактная фабрика
Бывают ситуации, когда у нас есть несколько схожих фабрик, и нам нужно скрыть логику выбора фабрики для каждого конкретного запроса. В этом нам поможет шаблон «Абстрактная фабрика»:
Наблюдатель
«Наблюдатель» – это шаблон, предусматривающий для наблюдаемого объекта возможность зарегистрировать наблюдателя, когда тот вызовет специальный метод.
Далее, если состояние наблюдаемого объекта меняется, он посылает сообщение об этом своим наблюдателям:
Адаптер
«Адаптер» позволяет надстроить над классом интерфейс, чтобы использовать его в системе, использующей иные соглашения вызова:
Поздняя (ленивая) инициализация
Представьте себе такую ситуацию: при создании инстанции объекта вы ещё не знаете, какие из (довольно ресурсоёмких) функций понадобятся объекту в будущем, а какие – нет.
В таких случаях необходимые операции по инициализации производятся только тогда, когда функция была впервые задействована, и при этом – только один раз:
Цепочка ответственности
Этот шаблон ещё иногда называют по-армейски: «Цепь командования». В его основе – серия обработчиков событий, передающих сообщения по цепочке.
Когда сообщение (команда, запрос) пробегает по цепочке, каждый обработчик самостоятельно определяет, должен ли он реагировать на сообщение, и если да, то как. Процесс останавливается, если обработчик знает, как обработать событие:
Пул объектов
«Пул объектов» – это ещё одна хэш-таблица. Объекты помещаются в неё сразу после инициализации и впоследствии извлекаются по мере необходимости:
Прототип
Иногда инициализация некоторых объектов может протекать в несколько стадий. Разумно было бы сэкономить ресурсы на первой стадии.
Для этого создаётся «прототип» – предварительно инициализированный и сохранённый объект, который затем может быть клонирован и окончательно инициализирован:
Строитель
Мы можем использовать этот шаблон, чтобы упростить создание сложного объекта:
Источник: https://www.internet-technologies.ru/articles/shablony-proektirovaniya-v-php.html