Категории
Паттерны проектирования
Перед началом статьи, я хочу предложить доклад своего товарища - Дениса Порпленко о паттернах проектирования в программировании:
А дальше продолжу более обще и расширенно, так как невозможно в одном докладе охватить всю тематику паттернов проектирования. Так же, как не охватить её и в одной статье.
Я хочу напомнить о том, что паттерны проектирования возникли как решение часто возникающих однотипных задач, собственно, в проектировании. Но основное свое развитие получили в программной разработке. И дальше буду продолжать повествование в контексте разработки программного обеспечения.
Тематика паттернов очень широка, паттерны проектирования можно разделить на такие типы, как шаблоны для программирования, шаблоны архитектуры системы и шаблоны хранения данных. Это самые популярные паттерны, есть и другие. Ниже я их все перечислю.
Многие компании используют в своей практике паттерны. Применение паттернов имеет свои плюсы и минусы.
Польза от применения шаблонов проектирования:
- основное преимущество использования шаблонов перед свободным проектированием состоит в том, что паттерн дает название проблеме и определяет способы решения многих проблем за счет готового набора абстракций
- облегчает коммуникацию между разработчиками системы
- использование шаблонов проектирования аналогично использованию готовых библиотек кода
- правильное использование шаблонов помогает разработчикам определить нужный вектор развития и уйти от многих проблем, которые могут возникнуть в процессе разработки.
Проблемы, которые порождают шаблоны проектирования:
- на мой взгляд, самая главная проблема использования шаблонов - потеря гибкости проектирования и разработки системы
- использование шаблонов усложняет систему
- слепое следование определенному шаблону и повсеместное его использование может породить кучу архитектурных и логических проблем
Основные шаблоны программирования
Фундаментальные
Шаблон делегирования ( 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 только зарегистрированные пользователи могут комментировать и оставлять рецензии. Авторизованный пользователь так же может ставить отметки книгам, фильмам и другим постам. Вести учет прочитанных книг и просмотренных фильмов. Добавлять посты в избранное и иметь к ним быстрый доступ.