Языки и технологии программирования.
Проектирование программного обеспечения.
Проектирование — это первоначальная фаза проекта, которая включает в себя следующие стадии:
концептуальную,
моделирования,
реализации (а также, тестирования, рефакторинга….).
Необходимо подобрать подходящие объекты, отнести их к различным классам, соблюдая разумную степень детализации, определить интерфейсы классов и иерархию наследования и установить существенные отношения между классами.
Дизайн должен, с одной стороны, соответствовать решаемой задаче, с другой - быть общим, чтобы удалось учесть все требования, которые могут возникнуть в будущем
«…любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново»
Кристофер Александр
Паттерны проектирования - описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте .
Польза от паттернов проектирования большая. Шаблон описывает решение целого класса абстрактных проблем. При этом каждый шаблон имеет свое имя, что облегчает дискуссию об абстрактных структурах данных между разработчиками (унификация терминологии). Правильно сформулированный шаблон проектирования позволяет, отыскав удачное решение, пользоваться им снова и снова.
В общем случае паттерн состоит из четырех основных элементов: имя, задача, решение, результаты.
Классификация

Пример(паттерн Abstract Factory):

Абстрактная фабрика - паттерн, порождающий объекты. Он предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Известен также под именем Kit (инструментарий).
Паттерн рекомендуется использвоать, когда:
ñ система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты;
ñ входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения;
ñ система должна конфигурироваться одним из семейств составляющих ее объектов;
ñ вы хотите предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.
Структура
![]() |
AbstractFactory – абстрактная фабрика :
объявляет интерфейс для операций, создающих абстрактные объекты-продукты;
ConcreteFactory – конкретная фабрика :
реализует операции, создающие конкретные объекты-продукты;
AbstractProduct – абстрактный продукт :
объявляет интерфейс для типа объекта-продукта;
ConcreteProduct – конкретный продукт :
определяет объект-продукт, создаваемый соответствующей конкретной фабрикой;
реализует интерфейс AbstractProduct;
Client – клиент:
пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и AbstractProduct.
Паттерн изолирует конкретные классы, упрощает замену семейств продуктов,
гарантирует сочетаемость продуктов, поддержать новый вид продуктов трудно.
Анти-паттерн
Анти-паттерны (anti-patterns), также известные как ловушки (pitfalls) — это классы наиболее часто внедряемых плохих решений проблем. Они изучаются, как категория, в случае когда их хотят избежать в будущем, и некоторые отдельные случаи их могут быть распознаны при изучении неработающих систем.
Анти-паттерн (примеры)
Базовый класс-утилита (BaseBean): Наследование функциональности из класса-утилиты вместо делегирования к нему.
Вызов предка (CallSuper): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка.
Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе).
Объектная клоака (Object cesspool): Переиспользование объектов, находящихся в непригодном для переиспользования состоянии.
Полтергейст (Poltergeist): Объекты, чьё единственное предназначение — передавать информацию другим объектам.
Проблема йо-йо (Yo-yo problem): Чрезмерная размытость сильно связанного кода (например, выполняемого по порядку) по иерархии классов.
Одиночество (антипаттерн) (Singletonitis): Избыточное использование паттерна одиночка.
Выводы
Как правило, паттерны поведения дополняют и усиливают друг друга. Хорошо продуманные объектно-ориентированные системы внешне похожи на собрание многочисленных паттернов. Композиция на уровне паттернов, а не классов или объектов, позволяет добиться той же синергии (суммарного эффекта), но с меньшими усилиями.
Задание
Реализовать паттерн Singleton ( одиночка ) на С+ +.
Пример использования.
Основные порталы (построено редакторами)


