Строитель шаблон - Builder pattern
В шаблон строителя это шаблон дизайна предназначен для обеспечения гибкого решения различных задач создания объектов в объектно-ориентированного программирования. Цель шаблона проектирования Builder - отдельный построение сложного объекта из его представления. Это один из Банда четырех шаблонов проектирования.
Обзор
Шаблон проектирования Builder - один из Шаблоны проектирования GoF[1] которые описывают, как решать повторяющиеся проблемы проектирования в объектно-ориентированном программном обеспечении.
Шаблон проектирования Builder решает такие проблемы, как:[2]
- Как может класс (один и тот же процесс построения) создавать разные представления сложного объекта?
- Как можно упростить класс, включающий создание сложного объекта?
Создание и сборка частей сложного объекта непосредственно в классе негибка. Он обязывает класс создавать конкретное представление сложного объекта и делает невозможным изменение представления позже независимо от (без необходимости изменения) класса.
Шаблон проектирования Builder описывает, как решать такие проблемы:
- Инкапсулируйте создание и сборку частей сложного объекта в отдельном
Строитель
объект. - Класс делегирует создание объекта
Строитель
объект вместо того, чтобы создавать объекты напрямую.
Класс (один и тот же процесс построения) может делегировать разным Строитель
объекты для создания различных представлений сложного объекта.
Определение
Назначение шаблона проектирования Builder - отделить построение сложного объекта от его представления. Таким образом, один и тот же процесс построения может создавать разные представления.[1]
Преимущества
К преимуществам паттерна Строитель можно отнести:[3]
- Позволяет варьировать внутреннее представление продукта.
- Инкапсулирует код для построения и представления.
- Обеспечивает контроль этапов строительного процесса.
Недостатки
К недостаткам паттерна Builder можно отнести:[3]
- Требуется создание отдельного ConcreteBuilder для каждого типа продукта.
- Требует, чтобы классы построителя были изменяемыми.
- Внедрение зависимостей может быть менее поддержано.
Структура
Схема классов и последовательности UML
В приведенном выше 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(); }}
Директор собирает экземпляр автомобиля в приведенном выше примере, делегируя строительство отдельному объекту-строителю, который был передан Директору Заказчиком.
Смотрите также
использованная литература
- ^ а б Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования. Эддисон Уэсли. стр.97ff. ISBN 0-201-63361-2.CS1 maint: несколько имен: список авторов (ссылка на сайт)
- ^ «Шаблон проектирования Builder - проблема, решение и применимость». w3sDesign.com. Получено 2017-08-13.
- ^ а б "Указатель / архив / 2010 / зима / 51023-1 / презентаций" (PDF). www.classes.cs.uchicago.edu. Получено 2016-03-03.
- ^ «Шаблон проектирования Builder - структура и взаимодействие». w3sDesign.com. Получено 2017-08-12.
внешние ссылки
- Статья JavaWorld Создавайте пользовательские интерфейсы без геттеров и сеттеров (Аллен Голуб ) показывает полный исходный код Java для Builder.