Особенности порождающих паттернов. Сравнение паттернов Abstract Factory, Factory Method и Prototype
Содержание
- 1. Особенности порождающих паттернов
- 2. Реализация задачи паттернами Prototype, Factory Method и Abstract Factory. Сравнение паттернов с помощью диаграмм классов
- Связанные темы
Поиск на других ресурсах:
1. Особенности порождающих паттернов
В случае, если система создает объекты разных классов, существует два способа параметризировать эту систему классами создаваемых объектов.
- Из класса, создающего объекты, породить подклассы. Каждый подкласс непосредственно создает соответствующий конкретный объект. Этот способ соответствует паттерну Factory Method (Фабричный метод). Недостатком этого патерна является необходимость создания нового подкласса только для того, чтобы изменить класс продукта. Если таких изменений много, то это порождает значительное множество подклассов.
- Реализовать композицию объектов. При этом подходе определяется объект, содержащий информацию о классах объектов, которые должны быть продуктами. Затем этот объект делается параметром системы. По этому принципу работают паттерны Abstract Factory (Абстрактная фабрика), Builder (Строитель) и Prototype (Прототип).
Для всех трех вышеупомянутых паттернов возникает понятие «фабричного объекта», предназначенного для изготовления продуктов.
В паттерне Abstract Factory «фабричный объект» создает объекты разных классов.
При реализации паттерна Builder, продукт создается «фабричным объектом» в соответствии с заданной последовательностью (протоколом) шагов.
Для паттерна Prototype характерно создание продукта путем получения копии из объекта-прототипа. Здесь фактически «фабричный объект» и есть продукт.
⇑
2. Реализация задачи паттернами Prototype, Factory Method и Abstract Factory. Сравнение паттернов с помощью диаграмм классов
Ниже приведена реализация музыкального редактора с помощью паттернов Prototype, Factory Method, Abstract Factory.
Пусть нужно построить музыкальный редактор, содержащий палитру инструментов и допускающий добавление новых музыкальных объектов в партитуру.
Музыкальный редактор отображается в графическом редакторе, представленном абстрактным классом Graphic. Графическими компонентами могут быть ноты (класс MusicalNote) и нотные состояния (класс Staff) и некоторый абстрактный класс (например Tool), который определяет инструменты в палитре. С этого абстрактного класса может быть определен подкласс GraphicTool для инструментов, которые создают графические объекты и добавляют их в документ.
Одно из решений задачи музыкального редактора предлагает паттерн Abstract Method. Рисунок 1 отображает подходящую диаграмму классов.
Абстрактный разработчик (интерфейс Graphic) объявляет метод NewGraphic(), создающий экземпляр продукта. Подклассы Staff и MusicalNote возвращают конкретный продукт.
Интерфейс продукта определен в абстрактном классе Tool. В качестве конкретных товаров выступают подклассы GraphicToolMusicalNote и GraphicToolStaff.
Figure 1. Музыкальный редактор. Реализация с помощью паттерна Factory Method
При использовании паттерна Factory Method происходит комбинаторный рост количества почти ничего не выполняющих подклассов. Это основной недостаток.
Другое решение задачи музыкального редактора предлагает паттерн Abstract Factory (рисунок 2). Здесь создаются две иерархии классов. Первая иерархия – это классы, создающие продукт. Эта иерархия определяется интерфейсом GraphicFactory, по которому возвращаются экземпляры конкретных продуктов. Из интерфейса GraphicFactory получаются конкретные продукты с помощью подклассов Staff и MusicalNote.
Вторая иерархия классов определяет получаемый продукт, в вершине которой описывается класс GraphicTool. Для представления конкретного продукта в иерархии определены два дополнительных подкласса StaffProduct и MusicalNoteProduct. Клиент получает продукт через интерфейс GraphicTool.
Рисунок 2. Музыкальный редактор. Реализация с помощью паттерна Abstract Factory
Преимущество паттерна Abstract Factory перед паттерном Factory Method проявляется в том случае, когда иерархия классов Graphic Factory уже существует и ее не нужно создавать.
Недостаток данного паттерна по сравнению с паттерном Prototype представляет собой создание дополнительных классов, что приводит к росту общей иерархии классов.
И, напоследок, решение задачи с помощью паттерна Prototype (рисунок 3). Здесь специфические ноты и нотные состояния клонируются (копируются) в GraphicTool через Graphic интерфейс. На рисунке 3 представлена диаграмма классов решения задачи с помощью паттерна Prototype.
Рисунок 3. Музыкальный редактор. Решение с помощью паттерна Prototype
Преимущество использования паттерна Prototype по сравнению с паттернами Factory Method (рисунок 1) и Abstract Factory (рисунок 2) – здесь следует реализовывать только метод Clone(). Это уменьшает количество подклассов.
⇑
Связанные темы
- Паттерн Abstract Factory. Решение задачи о составляющих компьютера
- Паттерн Factory Method. Реализация структуры на C++
- Паттерн Prototype. Реализация структуры на C++
⇑