- •Оболочка .Net Framework
- •Свойства качественной программы.
- •Int beta; // Спецификатор private по умолчанию,
- •Наследование.
- •Int beta; // Спецификатор private по умолчанию,
- •Сортировка массива методом прямого выбора
- •Сортировка массива методом прямого обмена (пузырьковым методом)
- •Сохранение текущего состояния объектов в файлах
- •Значение параметра FileMode
- •Паттерны проектирования
- •Порождающие паттерны
- •Структурные паттерны
- •Паттерны поведения
Паттерны проектирования
Архитектура системы должна, с одной стороны, соответствовать решаемой задаче, с другой — быть достаточно общей, чтобы сделать возможным внесение изменений, которые могут потребоваться в будущем. Паттерн — это описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. Паттерны выявляются по мере накопления опыта разработок, когда программист использует одну и ту же схему организации и взаимодействия объектов в разных контекстах.
Применение паттернов (шаблонов) наряду с объектной технологией позволяет вывести процесс проектирования из области интуиции и представить систему на более высоком уровне абстракции — на уровне схем взаимодействия объектов, в результате чего система становится более прозрачной и понятной.
Все паттерны в соответствии с их назначением разделены на три группы: порождающие, структурные и паттерны поведения. Порождающие паттерны описывают способы создания объектов, структурные — схемы организации классов и объектов, а паттерны поведения определяют типичные схемы взаимодействия классов и объектов.
Порождающие паттерны
Порождающие паттерны проектирования абстрагируют процесс создания классов и объектов с целью обеспечить гибкость системы, то есть помогают сделать систему независимой от способа создания композиции и представления объектов. Эти паттерны инкапсулируют знания о конкретных классах и скрывают детали того, как эти классы создаются и стыкуются. Таким образом, можно собрать систему из «готовых» объектов с самой различной структурой и функциональностью статически (на этапе компиляции) или динамически (во время выполнения).
Паттерн, порождающий классы, использует наследование, чтобы варьировать создаваемый класс, а паттерны, порождающие объекты, передают инстанцирование другим объектам.
Фабричный метод (Factory Method) определяет интерфейс для создания объектов, при этом требуемый класс создается с помощью подклассов. В подклассе определяется метод (то есть собственно фабричный метод), который возвращает экземпляр конкретного подкласса.
Фабричные методы избавляют проектировщика от необходимости встраивать в код зависящие от приложения классы. Код имеет дело только с интерфейсом подкласса, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов.
Паттерн используется в следующих случаях:
классу заранее не известно, объекты каких классов ему нужно создавать;
класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами;
класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и вы планируете локализовать знание о том, какой класс принимает эти обязанности на себя.
Фабричные методы часто применяются в инструментальных библиотеках и каркасах.
Абстрактная фабрика (Abstract Factory) предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны.
От класса «абстрактная фабрика» наследуются классы конкретных фабрик, которые содержат методы создания конкретных объектов-продуктов, являющихся наследниками класса «абстрактный продукт», объявляющего интерфейс для их создания. Клиент пользуется только интерфейсами, заданными в классах «абстрактная фабрика» и «абстрактный продукт».
Паттерн изолирует клиента от деталей реализации классов, упрощает замену семейств продуктов и гарантирует их сочетаемость. Паттерн применяется, если:
система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты;
входящие в семейство взаимосвязанные объекты должны использоваться вместе, и вам необходимо обеспечить выполнение этого ограничения;
система должна конфигурироваться одним из семейств составляющих ее объектов;
вы хотите предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.
Одиночка (Singleton) гарантирует, что некоторый класс может иметь только один экземпляр, и предоставляет глобальную точку доступа к нему.
Для некоторых классов важно, чтобы существовал только один экземпляр. При этом сам класс контролирует то, что у него есть только один экземпляр, может запретить создание дополнительных экземпляров, перехватывая запросы на создание новых объектов, и он же способен предоставить доступ к своему экземпляру.
Одиночка определяет операцию Instance, которая позволяет клиентам получать доступ к единственному экземпляру. Клиенты имеют доступ к одиночке только через эту операцию.
Паттерн позволяет избежать засорения пространства имен глобальными переменными, в которых хранятся уникальные экземпляры. От класса Singleton можно порождать подклассы, а приложение легко сконфигурировать экземпляром расширенного класса.
Реализуется одиночка обычно с помощью статического метода класса, который имеет доступ к переменной, хранящей уникальный экземпляр, и гарантирует инициализацию переменной этим экземпляром перед возвратом ее клиенту.
Прототип (Prototype) описывает виды создаваемых объектов с помощью экземпляра-прототипа и создаст новые объекты путем его копирования.
Класс «прототип» задает интерфейс для клонирования себя (например, с помощью метода, возвращающего копию себя). От этого класса наследуются конкретные классы, реализующие ту же операцию. Клиент обращается к прототипу, чтобы тот создал свою копию.
У прототипа те же самые результаты, что у абстрактной фабрики и строителя: он скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен. Кроме того, все эти паттерны позволяют клиентам единообразно работать со специфичными для приложения классами.
Некоторые дополнительные преимущества паттерна:
добавление и удаление продуктов во время выполнения. Прототип позволяет включать новый конкретный класс продуктов в систему, просто сообщив клиенту о новом экземпляре-прототипе;
уменьшение числа подклассов. При использовании этого паттерна нет необходимости запрашивать фабричный метод создать новьй объект — просто клонируется прототип.
Строитель (Builder) отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс конструирования для создания различных внутренних представлений объекта.
Паттерн позволяет строить сложные объекты, процесс создания которых состоит скольких этапов. Класс «строитель» задает абстрактный интерфейс для создания частей объекта, а его подклассы («конкретные строители») реализуют этот интерфейс, определяют порядок сборки и предоставляют интерфейс к создаваемому объекту.
Клиент для создания объекта создаст объект-распорядитель, конфигурируя его конкретным строителем. Распорядитель конструирует объект из частей, пользуясь интерфейсом строителя и вызывая методы конкретного строителя.
Поскольку продукт конструируется через абстрактный интерфейс, то для изменения внутреннего представления достаточно всего лишь определить новый вид конкретного строителя. Данный паттерн улучшает модульность, инкапсулируя способ конструирования и представления сложного объекта. Клиентам ничего не надо знать о классах, определяющих внутреннюю структуру продукта.
В отличие от порождающих паттернов, которые сразу конструируют весь объект целиком, строитель делает это шаг за шагом под управлением распорядителя, что дает более тонкий контроль над процессом конструирования.
