Строитель шаблон - Builder pattern

В шаблон строителя это шаблон дизайна предназначен для обеспечения гибкого решения различных задач создания объектов в объектно-ориентированного программирования. Цель шаблона проектирования Builder - отдельный построение сложного объекта из его представления. Это один из Банда четырех шаблонов проектирования.

Обзор

Шаблон проектирования Builder - один из Шаблоны проектирования GoF[1] которые описывают, как решать повторяющиеся проблемы проектирования в объектно-ориентированном программном обеспечении.

Шаблон проектирования Builder решает такие проблемы, как:[2]

  • Как может класс (один и тот же процесс построения) создавать разные представления сложного объекта?
  • Как можно упростить класс, включающий создание сложного объекта?

Создание и сборка частей сложного объекта непосредственно в классе негибка. Он обязывает класс создавать конкретное представление сложного объекта и делает невозможным изменение представления позже независимо от (без необходимости изменения) класса.

Шаблон проектирования Builder описывает, как решать такие проблемы:

  • Инкапсулируйте создание и сборку частей сложного объекта в отдельном Строитель объект.
  • Класс делегирует создание объекта Строитель объект вместо того, чтобы создавать объекты напрямую.

Класс (один и тот же процесс построения) может делегировать разным Строитель объекты для создания различных представлений сложного объекта.

Определение

Назначение шаблона проектирования Builder - отделить построение сложного объекта от его представления. Таким образом, один и тот же процесс построения может создавать разные представления.[1]

Преимущества

К преимуществам паттерна Строитель можно отнести:[3]

  • Позволяет варьировать внутреннее представление продукта.
  • Инкапсулирует код для построения и представления.
  • Обеспечивает контроль этапов строительного процесса.

Недостатки

К недостаткам паттерна Builder можно отнести:[3]

  • Требуется создание отдельного ConcreteBuilder для каждого типа продукта.
  • Требует, чтобы классы построителя были изменяемыми.
  • Внедрение зависимостей может быть менее поддержано.

Структура

Схема классов и последовательности UML

Пример класса UML и диаграммы последовательности для шаблона проектирования Builder.[4]

В приведенном выше UML диаграмма классов, то Директор класс не создает и не собирает ПродуктA1 и ПродуктB1 объекты напрямую. Директор относится к Строитель интерфейс для построения (создания и сборки) частей сложного объекта, что делает Директор независимо от того, какие конкретные классы создаются (какое представление создается). Builder1 класс реализует Строитель интерфейс путем создания и сборки ПродуктA1 и ПродуктB1 объекты.
В UML схема последовательности показывает взаимодействия во время выполнения: Директор вызовы объектов buildPartA () на Builder1 объект, который создает и собирает ПродуктA1 объект. Директор звонки buildPartB () на Builder1, который создает и собирает ПродуктB1 объект.

Диаграмма классов

Строитель Структура
Строитель
Абстрактный интерфейс для создания объектов (продукта).
ConcreteBuilder
Предоставляет реализацию для Builder. Это объект, способный создавать другие объекты. Конструирует и собирает детали для создания объектов.

Примеры

C #

/// <резюме>/// представляет продукт, созданный застройщиком/// общественный класс Машина{    общественный строка Сделать { получать; набор; }    общественный строка Модель { получать; набор; }    общественный int NumDoors { получать; набор; }    общественный строка Цвет { получать; набор; }    общественный Машина(строка делать, строка модель, строка цвет, int numDoors)    {        Сделать = делать;        Модель = модель;        Цвет = цвет;        NumDoors = numDoors;    }}/// <резюме>/// Абстракция строителя/// общественный интерфейс ICarBuilder{    строка Цвет { получать; набор; }    int NumDoors { получать; набор; }    Машина GetResult();}/// <резюме>/// Реализация бетонного строителя/// общественный класс FerrariBuilder : ICarBuilder{    общественный строка Цвет { получать; набор; }    общественный int NumDoors { получать; набор; }    общественный Машина GetResult()    {        вернуть NumDoors == 2 ? новый Машина("Феррари", «488 Паук», Цвет, NumDoors) : значение NULL;            }}/// <резюме>/// Директор/// общественный класс СпортАвтомобилейДиректор{    частный ICarBuilder _builder;    общественный СпортАвтомобильСтроитьДиректор(ICarBuilder строитель)     {        _builder = строитель;    }    общественный пустота Построить()    {        _builder.Цвет = "Красный";        _builder.NumDoors = 2;    }}общественный класс Клиент{    общественный пустота DoSomethingWithCars()    {        вар строитель = новый FerrariBuilder();        вар директор = новый СпортАвтомобильСтроитьДиректор(строитель);        директор.Построить();        Машина myRaceCar = строитель.GetResult();    }}

Директор собирает экземпляр автомобиля в приведенном выше примере, делегируя строительство отдельному объекту-строителю, который был передан Директору Заказчиком.

Смотрите также

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

  1. ^ а б Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования. Эддисон Уэсли. стр.97ff. ISBN  0-201-63361-2.CS1 maint: несколько имен: список авторов (ссылка на сайт)
  2. ^ «Шаблон проектирования Builder - проблема, решение и применимость». w3sDesign.com. Получено 2017-08-13.
  3. ^ а б "Указатель / архив / 2010 / зима / 51023-1 / презентаций" (PDF). www.classes.cs.uchicago.edu. Получено 2016-03-03.
  4. ^ «Шаблон проектирования Builder - структура и взаимодействие». w3sDesign.com. Получено 2017-08-12.

внешние ссылки