Что такое паттерн GOF
Паттерн GOF (Gang of Four) — это набор основных шаблонов проектирования, описанных в книге «Design Patterns: Elements of Reusable Object-Oriented Software» («Приемы объектно-ориентированного проектирования. Паттерны проектирования») авторства Эриха Гаммы, Ричарда Хелма, Ральфа Джонсона и Джона Влиссидеса. Эта книга, изданная в 1994 году, стала одной из наиболее известных и влиятельных книг в области проектирования программного обеспечения.
Книга определяет 23 различных шаблона проектирования, которые объединены в три категории:
К содержанию ↑Шаблоны создания (Creational Patterns)
- Фабричный метод (Factory Method): определяет интерфейс для создания объектов, позволяя подклассам выбирать класс для инстанцирования.
- Абстрактная фабрика (Abstract Factory): предоставляет интерфейс для создания семейств взаимосвязанных объектов без указания их конкретных классов.
- Строитель (Builder): предоставляет способ создания сложного объекта шаг за шагом, не раскрывая его внутреннего представления.
- Прототип (Prototype): определяет протокол создания объекта путем копирования уже существующего объекта вместо создания нового экземпляра с нуля. Это позволяет создавать новые объекты, избегая сложной логики инициализации.
- Одиночка (Singleton): гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Шаблоны структуры (Structural Patterns)
- Адаптер (Adapter): преобразует интерфейс одного класса в другой, чтобы классы с несовместимыми интерфейсами могли работать вместе.
- Мост (Bridge): разделяет абстракцию от ее реализации, позволяя им меняться независимо друг от друга. Это позволяет легко добавлять новые варианты реализации без изменения абстракции.
- Компоновщик (Composite): обрабатывает отдельные объекты и группы объектов единообразно. Он позволяет создавать иерархические древовидные структуры из объектов и работать с ними, как с единым объектом.
- Декоратор (Decorator): динамически добавляет новую функциональность объекту путем оборачивания его в другой класс.
- Фасад (Facade): предоставляет унифицированный интерфейс для набора интерфейсов в сложной системе. Он упрощает взаимодействие с системой, скрывая ее сложность и предоставляя удобный способ работы с ней.
- Легковес (Flyweight): позволяет эффективно поддерживать множество мелких объектов, используя общие данные и сокращая использование памяти.
- Заместитель (Proxy): представляет объект-заместитель, контролирующий доступ к другому объекту и предоставляющий дополнительную функциональность.
Шаблоны поведения (Behavioral Patterns)
- Цепочка обязанностей (Chain of Responsibility): позволяет создавать цепочку объектов, которые последовательно обрабатывают запросы, передавая их по цепи, пока один из объектов не обработает запрос или он не достигнет конца цепи.
- Команда (Command): инкапсулирует запрос в виде объекта, позволяя параметризовать клиентов с разными запросами, организовывать историю команд и поддерживать отмену операций.
- Итератор (Iterator): предоставляет способ последовательного доступа к элементам коллекции без раскрытия ее внутренней структуры.
- Медиатор (Mediator): определяет объект, который инкапсулирует способ взаимодействия между набором объектов, обеспечивая слабую связь между ними. Это позволяет уменьшить зависимости между объектами и сделать систему более гибкой.
- Хранитель (Memento): позволяет зафиксировать и сохранить внутреннее состояние объекта так, чтобы его можно было восстановить позже, без раскрытия деталей реализации.
- Наблюдатель (Observer): определяет зависимость «один-ко-многим» между объектами, чтобы при изменении состояния одного объекта все зависящие от него объекты автоматически обновлялись.
- Состояние (State): позволяет объекту изменять свое поведение при изменении его внутреннего состояния.
- Стратегия (Strategy): определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
- Шаблонный метод (Template Method): определяет скелет алгоритма, перекладывая некоторые шаги на подклассы.
- Посетитель (Visitor): позволяет добавлять новые операции к объектам без изменения их классов. Он достигается путем вынесения операций в отдельные классы посетителей, которые могут быть применены к объектам.
Вывод
Каждый шаблон представляет собой описание типичной проблемы проектирования и способа ее решения. Они предлагают общие рекомендации по организации классов, объектов и взаимодействия между ними, чтобы достичь гибкости, переиспользуемости и расширяемости кода.
Важно отметить, что паттерны GOF не являются простыми правилами, которые следует безоговорочно применять во всех ситуациях. Их применение требует обдуманности и адаптации к конкретной задаче и контексту проекта.