Будівник (шаблон проектування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Будівельник(англ. Builder) — шаблон проектування, відноситься до класу твірних шаблонів. На відміну від шаблону абстрактної фабрики і фабричного методу, ціль яких є застосування поліморфізму, задачею шаблону будівельника є забезпечення реалізації анти-шаблону телескопічного (багатоступеневого) конструювання. Анти-шаблон "телескопічний конструктор" коли різна комбінація параметрів конструктора призводить до появи експоненційної множини конструкторів. Замість того щоб використовувати набір конструкторів, використовують шаблон будівельник, згідно якого використовують інший об'єкт (будівельник), що отримує на вхід вхідні параметри по одному, крок за кроком, і повертає за один прохід результуючий створений об'єкт.

Призначення[ред.ред. код]

Відокремлює конструювання складного об'єкта від його подання, таким чином у результаті одного й того ж процесу конструювання можуть бути отримані різні подання.

Мотивація[ред.ред. код]

Вам запропоновано створити систему планування екскурсій по Паттернленду - новому парку розваг. Гості парку можуть вибрати готель, замовити квитки на атракціони, зарезервувати місця в ресторані і навіть замовити спеціальні заходи. Поїздки можуть відрізнятися за кількістю днів і складу розважальної програми. Наприклад, місцевий житель не бажає зупинятися у готелі, але хоче замовити обід та спеціальні заходи. Другий гість прилітає літаком і йому необхідно забронювати номер в готелі, столик в ресторані і квитки на заходи. Таким чином, нам потрібна гнучка структура даних, яка може представляти програму поселення з усіма можливими варіаціями; крім того, побудова програми може складатися з декількох кроків.

Застосування[ред.ред. код]

Слід використовувати шаблон Будівельник коли:

  • алгоритм створення складного об'єкта не повинен залежати від того, з яких частин складається об'єкт та як вони стикуються поміж собою;
  • процес конструювання повинен забезпечити різні подання об'єкта, що конструюється.

Структура[ред.ред. код]

UML діаграма, що описує структуру шаблону проектування Будівник
  • Builder — будівельник:
    • визначає абстрактний інтерфейс для створення частин об'єкта Product;
  • ConcreteBuilder — конкретний будівельник:
    • конструює та збирає докупи частини продукту шляхом реалізації інтерфейсу Builder;
    • визначає подання, що створюється, та слідкує на ним;
    • надає інтерфейс для доступу до продукту;
  • Director — управитель:
    • конструює об'єкт, користуючись інтерфейсом Builder;
  • Product — продукт:
    • подає складний конструйований об'єкт. ConcreteBuilder будує внутрішнє подання продукту та визначає процес його зборки;
    • вносить класи, що визначають складені частини, у тому числі інтерфейси для зборки кінцевого результату з частин.

Відносини[ред.ред. код]

  • клієнт створює об'єкт-управитель Director та конфігурує його потрібним об'єктом-будівником Builder;
  • управитель повідомляє будівельника про те, що потрібно побудувати наступну частину продукту;
  • будівельник оброблює запити управителя та додає нові частини до продукту;
  • клієнт забирає продукт у будівельника.
UML діаграма, що описує взаємовідносини між будівником та клієнтом

Реалізація[ред.ред. код]

Приклад VS С++[ред.ред. код]

#include "stdafx.h"
#include <iostream>
#include <string>
 
class CReportBuilder // Builder
{
public:
	virtual ~CReportBuilder() {};
 
	virtual void CreateHeader() {};
	virtual void CreateBody() {};
	virtual void CreateFooter() {};
 
	virtual void Print() {
		std::cout << m_strReport << std::endl;
	};
 
protected:
	std::string m_strReport;
};
 
class CTextReportBuilder: public CReportBuilder // ConcreteBuilder1
{
public:
	virtual ~CTextReportBuilder() {};
 
	virtual void CreateHeader() {
		m_strReport.append("SIMPLE REPORT'S HEADER \n");
	};
	virtual void CreateBody() {
		m_strReport.append("\n\"Simple Report's Main Text\"\n \n");
	};
	virtual void CreateFooter() {
		m_strReport.append("Simple Report's Footer \n");
	};
};
 
class CHTMLReportBuilder: public CReportBuilder // ConcreteBuilder2
{
public:
	virtual ~CHTMLReportBuilder() {};
 
	virtual void CreateHeader() {
		m_strReport.append("<HTML><BODY> \n");
		m_strReport.append("<H1>HTML REPORT'S HEADER</H1> \n");
	};
	virtual void CreateBody() {
		m_strReport.append("<p>\"HTML Report's Main Text\"</p> \n");
	};
	virtual void CreateFooter() {
		m_strReport.append("<p><i>HTML Report's Footer</i></p> \n");
		m_strReport.append("</BODY></HTML>");
	};
};
 
void CreateReport(CReportBuilder& report) // Director. Director creates product by using Builder's interface.
{
	report.CreateHeader();
	report.CreateBody();
	report.CreateFooter();
};
 
int _tmain(int argc, _TCHAR* argv[])
{
	CHTMLReportBuilder Report; // Product
	CreateReport(Report);
	Report.Print();
	return 0;
}

Джерела[ред.ред. код]

Література[ред.ред. код]

Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.