Анализ использования паттерна Строитель

Рассмотрение особенностей применения паттерна Строитель в программной среде Java. Сбор информации о строительном проекте в структурированной базе данных. Проектирование информационной системы, регулирующей взаимоотношения между распорядителем и клиентом.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 27.11.2017
Размер файла 144,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ООО “Мирантис ИТ”, Саратов, Россия

Анализ использования паттерна Строитель

В.С. Денисов

Паттерн Строитель (Builder) является, пожалуй, одним из самых многогранных из всех порождающих паттернов представленных в [1]. Однако его роль недооценивается, и он часто остается незамеченным среди более простых и понятных порождающих паттернов: Абстрактная Фабрика, Одиночка, Прототип. Далее предлагается рассмотреть несколько модификаций паттерна Строитель. В одних случаях они приближают Строитель к паттерну Посетитель, а в других случаях к паттерну Фабрика, но, тем не менее, характер использования паттерна остается прежним, лишь добавляются некоторые оттенки, позволяющие более тонко управлять исходящими зависимостями и модульностью кода [2].

Паттерн Строитель широко известен благодаря [1]. Данный паттерн отделяет процесс конструирования сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.

Рис. 1

Классическое применение паттерна Строитель представлено на диаграмме классов на Рис. 1. Диаграмма взаимодействий на Рис. 2 иллюстрирует взаимоотношения строителя и распорядителя с клиентом. Такой вариант Строителя можно, например, использовать в коде, задача которого - отображение графиков произвольного вида (см. Рис. 3).

Рис. 2

Размещено на http://www.allbest.ru/

Рис. 3

В этом случае роль клиента будет исполнять главная программа, роль распорядителя исполняет часть системы, которая отвечает за сбор информации в базе данных - PriceData, а построение графика конкретного вида (круговой, линия, столбцы) поручается конкретному строителю - классу, который реализует интерфейс ChartBuilder. Такое использование позволяет абстрагировать процесс конструирования от реализации конструируемого объекта.

На практике часто встречаются модификации паттерна, позволяющие управлять зависимостями внутри проекта. Так, вариации паттерна можно разделить по положению вызова метода GetResult. Метод может вызываться либо из распорядителя, либо из клиента.

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

Если вызов происходит из распорядителя, то в данном случае результат требуется самому распорядителю, но он не знает реализацию. Если в клиенте не происходит вызова set-методов строителя, то такую реализацию паттерна Строитель можно легко заменить на Абстрактную Фабрику. В случае же когда часть строителя должна быть настроена перед передачей распорядителю, то Фабрика не подходит, так как сосредотачивается на синхронном построении объекта. При таком раскладе лучше всего подойдет паттерн Строитель.

Размещено на http://www.allbest.ru/

Рис. 4

Вариации паттерна Строитель также могут проявляться в числе распорядителей.

Распорядители могут отсутствовать при использовании паттерна Строитель. В этом случае паттерн используется преимущественно в связи с полезным свойством, описанным ниже, - для получения конструктора с именованными аргументами. Клиент одновременно является распорядителем.

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

Распорядителей может быть больше одного. Каждый в цепи распорядителей устанавливает только ему одному известные значения для строителя и передает строителя следующему распорядителю. В таком виде паттерн напоминает паттерн Посетитель. Паттерн Посетитель обычно используется для обработки паттерна компоновщик. В случае применения паттерна Строитель посещаемые объекты могут иметь произвольную природу. Иллюстрация для нескольких распорядителей приведена на Рис. 5.

Рис. 5

Одна из главных причин для использования паттерна Строитель - это обращение зависимостей (в [1] это также является и требованием). Строитель передается распорядителю при конструировании, что обеспечивает изоляцию от реализации конкретного строителя.

Еще одной причиной использования паттерна Строитель, как указывается в [3], может являться большое количество аргументов создаваемого класса. Рассмотрим такое использование паттерна Строитель на примере кода.

new Builder().setA(value1).setB(value2).createProduct();

Из приведенного листинга ясно, что value1 станет A в новом продукте, а value2 станет B. Это позволяет изменять порядок установки аргументов строителя, а именование аргументов делает код более читабельным. Вызов метода GetResult осуществляется самим распорядителем, который одновременно является и клиентом. Строитель берет на себя задачу сходную с задачами паттерна Фабрика, но в отличие от Фабрики, задача которой предоставлять доступ к конструированию группы связанных классов, паттерн Строитель сосредотачивается на создании экземпляров одного класса.

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

Разнесение установки аргументов во времени позволяет ослаблять зависимости классов. Каждый класс может устанавливать только те аргументы, которые ему известны, и передавать строителя по цепочке вызовов дальше. Такое применение паттерна Строитель делает его похожим на паттерн Посетитель (так же можно провести аналогию с каррированными функциями и частичным применением функций). Вызов метода GetResult может осуществляться как в начале цепочки вызовов так и конце.

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

Проиллюстрируем сказанное на примере, представленном на Рис. 5. Метод GetResult может вызывать как класс classA так и класс classC. В обоих случаях и класс classA, и classC могут ничего не знать о зависимостях друг друга, что уменьшает зависимость каждого из них, но благодаря паттерну Строитель они получают нужный объект для работы. Кроме этого classC, получая частично сконфигурированного строителя, имеет возможность менять только ему известную часть и тем самым получать разные объекты в зависимости от потребностей.

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

Паттерн Строитель представляет собой достаточно мощный и гибкий инструмент борьбы с зависимостями внутри проекта и обращения зависимостей. К сожалению, использование паттерна Строитель требует написания большого количества стереотипного кода, что затрудняет эффективное использование этого паттерна в современных языках.

Как справедливо заметил Роб Пайк в своем выступлении на OSCON 2010 паттерны - это, как правило, решения, поддержки которых не достает на уровне языка. Остается надеяться, что работа с паттерном Строитель в новых языках будет такой же дешевой, как и написание конструктора.

Список литературы

паттерн строитель программный java

Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. СПб : Питер, 2010.

Денисов В. Критерий тестируемости исходного кода // RSDN Magazine. 2010. № 2.

Bloch J. Effective Java. Prentice Hall, 2008.

More on getters and setters - JavaWorld [Электронный ресурс]. URL: http://www.javaworld.com/javaworld/jw-01-2004/jw-0102-toolbox.html (дата обращения: 06.02.2011)

Размещено на Allbest.ru


Подобные документы

  • Исследование приемов объектно-ориентированного проектирования. Описания паттернов поведения, предназначенных для распределения обязанностей между объектами в системе. Признаки применения, использования паттерна "Декоратор". Принцип действия репозитория.

    реферат [686,9 K], добавлен 21.09.2013

  • Характеристика основных этапов создания программной системы. Сведения, хранимые в базе данных информационной системы музея. Описание данных, их типов и ограничений. Проектирование базы данных методом нормальных форм. Технические и программные средства.

    курсовая работа [1,8 M], добавлен 23.01.2014

  • Рассмотрение основ использования информационных технологий в гостиничном бизнесе. Выбор системы управления базами данных. Описание информационной технологии. Выполнение программной реализации в среде объектно-ориентированного программирования Delphi 7.

    курсовая работа [2,1 M], добавлен 24.09.2014

  • Проектирование информационной системы по учету оказания услуг негосударственного образовательного учреждения "Центр бухгалтерии и бизнеса". Требования заказчика к разрабатываемой базе данных. Функциональная структура программной системы обработки данных.

    курсовая работа [1,4 M], добавлен 26.11.2011

  • Создание информационной системы товарооборота на основе использования технологий баз данных кирпичного завода. Физическая модель базы данных. Проектирование БД в СУБД Microsoft SQL Server. Схема функциональной структуры программной системы. Запросы к БД.

    курсовая работа [3,5 M], добавлен 05.03.2015

  • Основные угрозы по отношению к информации. Понятия, методы и способы обеспечения защиты данных. Требования к системе защиты. Механизм авторизации в информационной базе для определения типа пользователя. Работа администратора с системой безопасности.

    курсовая работа [201,1 K], добавлен 24.06.2013

  • Анализ предметной области объекта автоматизации "Компьютерные курсы". Обзор информационных технологий, подходящих для разработки информационной системы. Требования к разрабатываемой базе данных и ее проектирование, особенности ее программной реализации.

    курсовая работа [369,8 K], добавлен 30.05.2013

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

    курсовая работа [2,4 M], добавлен 24.06.2011

  • Разработка программных средств для информационной системы поиска человека в городе и в деревне с помощью шаблона "цепочка обязанностей". Модель предметной области. Начальная диаграмма вариантов использования. Название и классификация данного паттерна.

    курсовая работа [2,3 M], добавлен 13.02.2016

  • Java DataBase Connectivity как платформенно-независимая технология, позволяющая из программы на Java получить доступ к любой SQL-совместимой базе данных, принцип ее работы и использование. Порядок построения данной системы, основные классы и интерфейсы.

    презентация [156,6 K], добавлен 21.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.