Паттерны проектирования

Перед началом статьи, я хочу предложить доклад своего товарища - Дениса Порпленко о паттернах проектирования в программировании:

А дальше продолжу более обще и расширенно, так как невозможно в одном докладе охватить всю тематику паттернов проектирования. Так же, как не охватить её и в одной статье.

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

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

Многие компании используют в своей практике паттерны. Применение паттернов имеет свои плюсы и минусы.

Польза от применения шаблонов проектирования:

- основное преимущество использования шаблонов перед свободным проектированием состоит в том, что паттерн дает название проблеме и определяет способы решения многих проблем за счет готового набора абстракций

- облегчает коммуникацию между разработчиками системы

- использование шаблонов проектирования аналогично использованию готовых библиотек кода

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

Проблемы, которые порождают шаблоны проектирования:

- на мой взгляд, самая главная проблема использования шаблонов - потеря гибкости проектирования и разработки системы

- использование шаблонов усложняет систему

- слепое следование определенному шаблону и повсеместное его использование может породить кучу архитектурных и логических проблем

Основные шаблоны программирования

Фундаментальные

Шаблон делегирования ( Delegation pattern ) - Объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.

Шаблон функционального дизайна ( Functional design ) - Гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы.

Неизменяемый интерфейс ( Immutable interface ) - Создание неизменяемого объекта.

Интерфейс ( Interface ) - Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять.

Интерфейс-маркер ( Marker interface ) - В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого могут применяться атрибуты или аннотации.

Контейнер свойств ( Property container ) - Позволяет добавлять дополнительные свойства для класса в контейнер (внутри класса), вместо расширения класса новыми свойствами.

Событийный шаблон ( Event channel ) - Расширяет шаблон Publish/Subscribe, создавая централизованный канал для событий. Использует объект-представитель для подписки и объект-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одного объекта, даже если он зарегистрирован только на одном канале.

Порождающие шаблоны

Порождающие шаблоны ( Creational ) - шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.

Абстрактная фабрика ( Abstract factory ) - Класс, который представляет собой интерфейс для создания компонентов системы.

Строитель ( Builder ) - Класс, который представляет собой интерфейс для создания сложного объекта. Фабричный метод ( Factory method ) - Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.

Отложенная инициализация ( Lazy initialization ) - Объект, инициализируемый во время первого обращения к нему.

Пул одиночек ( Multiton ) - Гарантирует, что класс имеет поименованные экземпляры объекта и обеспечивает глобальную точку доступа к ним.

Объектный пул ( Object pool ) - Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов.

Прототип ( Prototype ) - Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор.

Получение ресурса есть инициализация ( Resource acquisition is initialization (RAII) ) - Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта.

Одиночка ( Singleton ) - Класс, который может иметь только один экземпляр.

Структурные шаблоны

Структурные шаблоны ( Structural ) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу. Адаптер ( Adapter / Wrapper ) - Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.

Мост ( Bridge ) - Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.

Компоновщик ( Composite ) - Объект, который объединяет в себе объекты, подобные ему самому.

Декоратор или Обёртка ( Decorator ) или ( Wrapper ) - Класс, расширяющий функциональность другого класса без использования наследования.

Фасад ( Facade ) - Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.

Единая точка входа ( Front controller ) - Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы.

Приспособленец ( Flyweight ) - Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.

Заместитель ( Proxy ) - Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.

Поведенческие шаблоны

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

Цепочка обязанностей ( Chain of responsibility ) - Предназначен для организации в системе уровней ответственности.

Команда ( Command ) - Представляет действие. Объект команды заключает в себе само действие и его параметры.

Интерпретатор ( Interpreter ) - Решает часто встречающуюся, но подверженную изменениям, задачу.

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

Посредник ( Mediator ) - Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.

Хранитель ( Memento ) - Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях.

Нулевой объект ( Null object ) - Предотвращает нулевые указатели, предоставляя объект «по умолчанию».

Наблюдатель ( Observer ) - Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.

Слуга ( Servant ) - Используется для обеспечения общей функциональности группе классов.

Спецификация ( Specification ) - Служит для связывания бизнес-логики.

Состояние ( State ) - Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.

Стратегия ( Strategy ) - Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.

Шаблонный метод ( Template method ) - Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.

Посетитель ( Visitor ) - Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы.

Простая политика - я знаю, что такой паттерн есть, но что он означает, пока не нашел. Если будет инфа - скиньте в комментариях.

Слушатель ( Event listener ) - аналогично

Одноразовый посетитель ( Single-serving visitor ) - Оптимизирует реализацию шаблона посетитель, который инициализируется, единожды используется, и затем удаляется.

Иерархический посетитель ( Hierarchical visitor ) - Предоставляет способ обхода всех вершин иерархической структуры данных (например, древовидной).

Шаблоны параллельного программирования

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

Активный объект ( Active Object ) - Служит для отделения потока выполнения метода от потока, в котором он был вызван. Использует шаблоны асинхронный вызов методов и планировщик.

Уклонитель ( Balking ) - Служит для выполнения действия над объектом только тогда, когда тот находится в корректном состоянии.

Привязка свойств ( Binding properties ) - Комбинирует несколько наблюдателей для обеспечения синхронизации свойств в различных объектах

Обмен сообщениями ( Messaging design pattern (MDP) ) - Позволяет компонентам и приложениям обмениваться информацией (сообщениями).

Блокировка с двойной проверкой ( Double-checked locking ) - Предназначен для уменьшения накладных расходов, связанных с получением блокировки.

Ассинхронные события ( Event-based asynchronous ) - Адресные проблемы с Асинхронным паттерном, которые возникают в программах с несколькими потоками.

Охраняемая приостановка ( Guarded suspension ) - Используется для блокировки выполнения действия над объектом только тогда, когда тот находится в корректном состоянии.

Полусинхронизация ( Half-Sync/Half-Async ) - пока нет данных про этот паттерн.

Лидеры ( Leaders/followers ) - пока нет данных про этот паттерн.

Замок ( Lock ) - Один поток блокирует ресурс для предотвращения доступа или изменения его другими потоками.

Монитор ( Monitor object ) - Объект, предназначенный для безопасного использования более чем одним потоком.

Реактор ( Reactor ) - Предназначен для синхронной передачи запросов сервису от одного или нескольких источников.

Блокировка чтение-запись ( Read write lock ) - Позволяет нескольким потокам одновременно считывать информацию из общего хранилища, но позволяя только одному потоку в текущий момент времени её изменять.

Планировщик ( Scheduler ) - Обеспечивает механизм реализации политики планирования, но при этом не зависящих ни от одной конкретной политики.

Пул потоков ( Thread pool ) - Предоставляет пул потоков для обработки заданий, представленных обычно в виде очереди.

Спецпотоковое хранилище ( Thread-specific storage ) - Служит для предоставления различных глобальных переменных для разных потоков.

Однопоточное выполнение ( Single thread execution ) - Препятствует конкурентному вызову метода, тем самым запрещая параллельное выполнение этого метода.

Кооперативный паттерн ( Cooperative pattern ) - Обеспечивает механизм безопасной остановки потоков исполнения, используя общий флаг для сигнализирования прекращения работы потоков.

Шаблоны архитектуры системы

Model-View-Controller (MVC) - Модель-представление-контроллер.

Model-View-Presenter

Model-View-View Model

Presentation-Abstraction-Control

Naked objects

Hierarchical Model–View–Controller

Enterprise шаблоны

Active Record — способ доступа к данным реляционных баз данных в объектно-ориентированном программировании.

Business Delegate

Composite Entity/Составная Сущность

Composite View

DAO (Data Access Object) Объект Доступа к Данным

Dispatcher View

Front Controller

Intercepting Filter

Registry

Service Activator

Service Locator/Локатор Службы

Service to Worker

Session Facade/Фасад Сессии

Transfer Object Assembler

Transfer Object/Объект Перемещения

Value List Handler/Обработчик Списка Значений

View Helper

Unit of Work

Другие типы шаблонов

Также на сегодняшний день существует ряд других шаблонов.

Хранилище ( Repository )

Carrier Rider Mapper описывают предоставление доступа к хранимой информации.

Аналитические шаблоны описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки

Коммуникационные шаблоны описывают процесс общения между отдельными участниками/сотрудниками организации

Организационные шаблоны описывают организационную иерархию предприятия/фирмы

Антипаттерны (Anti-Design-Patterns) описывают, как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации

Информация
Автор webmancer Нравится 0
Рейтинг 1 Не нравится 0
Голосов 1 Прочитали 1
Дата 2014-04-13 09:00:00 В избранном 0
Ваша реакция

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

Зарегистрироваться

Авторизоваться

На рекомендательном сервисе WEBmancer.Org только зарегистрированные пользователи могут комментировать и оставлять рецензии. Авторизованный пользователь так же может ставить отметки книгам, фильмам и другим постам. Вести учет прочитанных книг и просмотренных фильмов. Добавлять посты в избранное и иметь к ним быстрый доступ.