Шаблон проектирования Строитель (Builder) относится к производящим шаблонам. Этот паттерн отделяет конструирование сложного объекта от его модели, т.е содержания и представления. Шаблон строитель следует использовать если:
- Алгоритм создания сложного объекта не должен зависеть от того, из
каких частей состоит объект, и как они стыкуются между собой. codelab.ru codelab.ru оригинал источник
- Процесс конструирования должен позволять создавать различные представления результирующего объекта.
- AbstractBuilder – строитель, абстрактный класс. Содержит перечень всех возможных абстрактных методов для создания и стыковки частей различных объектов (продуктов).
- ConcreteBuilder – конкретный строитель, занимающийся созданием какого-либо одного объекта (продукта). Конструирует
и связывает вместе части продукта посредством реализации только тех
абстракных методов интерфейса AbstractBuilder, которые нужны для создания частей
этого продукта. Кроме этого – определяет внутреннее представление этого
сложного объекта и предоставляет интерфейс для его получения.
- Director – распорядитель. Фиксированный,
единый алгоритм создания любых продуктов, для которых имеется
соответствующий AbstractBuilder. Конструирует продукт пользуясь общим
интерфейсом AbstractBuilder.
- Product – конечный продукт, построенный с помощью конкретного ConcreteBuilder. Представляет
сложный конструируемый объект. ConcreteBuilder строит внутреннее
представление продукта и определяет процесс его сборки. Помимо этого
может включать классы, которые определяют составные части, в том числе
интерфейсы для сборки конечного результата из частей.
Последовательность вызова при реализации паттерна "Строитель": Допустим нам нужно написать систему по генерации контента на веб-странице. Веб страница состоит из разделов: заголовка, меню, подвала, текстовой области, формы входа и новостей. Сделаем эту систему на строителе: //Интерфейс строителя страницы сайта interface SitePageBuilder{ //строители заголовка, меню, текстовой области, подвала, формы логина, новостей void BuildCaption(); void BuildMainMenu(); void BuildTextArea(); void BuildFooter(); void BuildLoginForm(); void BuildNews(); //возвращает результирующу страницу String GetResultSitePage(); }
//класс директора - он определяет как Builder должен построить страницу сайта abstract class PageDirector{ //ссылка на строителя protected SitePageBuilder pageBuilder;
//при создании объекта инициализируем ссылку на строителя PageDirector(SitePageBuilder pb){ this.pageBuilder = pb; }
abstract String GetSitePage(); }
//уточненный билдер страницы сайта class FirsPageBuilder implements SitePageBuilder{
private String Result = "";
@Override public void BuildCaption() { Result = Result + "<div>Заголовок сайта компании Рога и Копыта</div>"; }
@Override public void BuildMainMenu() { Result = Result + "<a href=\"index.hml\">На главную</a> <a href=\"about.hml\">О компании</a> <a href=\"clients.hml\">Наши клиенты</a> "; }
@Override public void BuildTextArea() { Result = Result + "<p>Компания Роги и Копыта производит мясную и молочную продукцию.</p>"; }
@Override public void BuildFooter() { Result = Result + "<div class=\"foooter\">Звоните по телефону: (4855)-11-11-11</div>"; }
@Override public void BuildLoginForm() { Result = Result + "<div><form>Введите логин и пароль</form><div>"; }
@Override public void BuildNews() { Result = Result + "Новости: первая новость, вторая новость...."; }
@Override public String GetResultSitePage() { return Result; }
}
//уточненный класс директора строителя class FirstPageDirector extends PageDirector{ //при создании объекта инициализируем ссылку на строителя FirstPageDirector(SitePageBuilder pb){ super (pb); }
//в данной функции реализуется определенная директором логика сборки документа String GetSitePage(){ pageBuilder.BuildCaption(); pageBuilder.BuildMainMenu(); pageBuilder.BuildNews(); pageBuilder.BuildTextArea(); pageBuilder.BuildLoginForm(); pageBuilder.BuildFooter(); return pageBuilder.GetResultSitePage(); } } Код клиента:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //клиентский код создает нужного директора и передает ему объект //нужного строителя FirstPageDirector fpd = new FirstPageDirector(new FirsPageBuilder()); //и вызывает метод на сборку документа jTextArea1.append(fpd.GetSitePage()); }
|