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

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

Будівельник(англ. 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