Шаблон строителя
Паттерн построитель — это шаблон проектирования , который обеспечивает гибкое решение различных проблем создания объектов в объектно-ориентированном программировании . Шаблон строитель отделяет построение сложного объекта от его представления. Это один из 23 классических шаблонов проектирования, описанных в книге « Шаблоны проектирования» (часто называемых «Бандой четырех» или просто «GoF»), который относится к подкатегории « творческий шаблон» . [1]
Обзор
[ редактировать ]Шаблон проектирования «строитель» решает такие проблемы, как: [2]
- Как класс (один и тот же процесс построения) может создавать разные представления сложного объекта?
- Как можно упростить класс, включающий создание сложного объекта?
Создание и сборка частей сложного объекта непосредственно внутри класса не является гибкой. Он обязывает класс создать конкретное представление сложного объекта и делает невозможным последующее изменение представления независимо от класса (без необходимости изменения).
Шаблон проектирования «строитель» описывает, как решать такие проблемы:
- Инкапсулируйте создание и сборку частей сложного объекта в отдельный
Builder
объект. - Класс делегирует создание объекта
Builder
объект вместо непосредственного создания объектов.
Класс (один и тот же процесс построения) может делегировать разным Builder
объекты для создания различных представлений сложного объекта.
Определение
[ редактировать ]Цель шаблона проектирования «Построитель» — отделить построение сложного объекта от его представления. Таким образом, один и тот же процесс построения может создавать разные представления. [1]
Преимущества
[ редактировать ]Преимущества шаблона строителя включают в себя: [3]
- Позволяет изменять внутреннее представление продукта.
- Инкапсулирует код для построения и представления.
- Обеспечивает контроль над этапами строительного процесса.
Недостатки
[ редактировать ]К недостаткам шаблона строителя относятся: [3]
- Для каждого типа продукта необходимо создать отдельный ConcreteBuilder.
- Классы Builder должны быть изменяемыми.
- Может затруднить/усложнить внедрение зависимостей.
- Во многих языках, безопасных для нулевых значений , шаблон компоновщика откладывает ошибки времени компиляции для неустановленных полей до времени выполнения .
Структура
[ редактировать ]Класс UML и диаграмма последовательности
[ редактировать ]
На приведенной выше UML классов диаграмме
тот Director
класс не создает и не собирает ProductA1
и ProductB1
объекты напрямую.
Вместо этого Director
относится к Builder
интерфейс для построения (создания и сборки) частей сложного объекта,
что делает Director
независимо от того, какие конкретные классы создаются (какое представление создается).
Builder1
класс реализует Builder
интерфейс путем создания и сборки ProductA1
и ProductB1
объекты.
Диаграмма UML последовательности показывает взаимодействие во время выполнения:
Director
вызовы объектов buildPartA()
на Builder1
объект, который создает и собирает ProductA1
объект.
После этого
тот Director
звонки buildPartB()
на Builder1
, который создает и собирает ProductB1
объект.
Диаграмма классов
[ редактировать ]
- Строитель
- Абстрактный интерфейс для создания объектов (продукта).
- Бетоностроитель
- Обеспечивает реализацию для Builder. Это объект, способный создавать другие объекты . Конструирует и собирает детали для сборки объектов.
Примеры
[ редактировать ]Пример С # :
/// <summary>
/// Represents a product created by the builder.
/// </summary>
public class Bicycle
{
public Bicycle(string make, string model, string colour, int height)
{
Make = make;
Model = model;
Colour = colour;
Height = height;
}
public string Make { get; set; }
public string Model { get; set; }
public int Height { get; set; }
public string Colour { get; set; }
}
/// <summary>
/// The builder abstraction.
/// </summary>
public interface IBicycleBuilder
{
Bicycle GetResult();
string Colour { get; set; }
int Height { get; set; }
}
/// <summary>
/// Concrete builder implementation.
/// </summary>
public class GTBuilder : IBicycleBuilder
{
public Bicycle GetResult()
{
return Height == 29 ? new Bicycle("GT", "Avalanche", Colour, Height) : null;
}
public string Colour { get; set; }
public int Height { get; set; }
}
/// <summary>
/// The director.
/// </summary>
public class MountainBikeBuildDirector
{
private IBicycleBuilder _builder;
public MountainBikeBuildDirector(IBicycleBuilder builder)
{
_builder = builder;
}
public void Construct()
{
_builder.Colour = "Red";
_builder.Height = 29;
}
public Bicycle GetResult()
{
return this._builder.GetResult();
}
}
public class Client
{
public void DoSomethingWithBicycles()
{
var director = new MountainBikeBuildDirector(new GTBuilder());
// Director controls the stepwise creation of product and returns the result.
director.Construct();
Bicycle myMountainBike = director.GetResult();
}
}
Директор собирает экземпляр велосипеда в приведенном выше примере, делегируя сборку отдельному объекту-строителю, который был передан Директору Клиентом.
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Jump up to: а б Гамма и др. 1994 , с. 97.
- ^ «Шаблон проектирования Builder — проблема, решение и применимость» . w3sDesign.com . Проверено 13 августа 2017 г.
- ^ Jump up to: а б «Указатель /архив/2010/зима/51023-1/презентации» (PDF) . www.classes.cs.uchicago.edu . Проверено 3 марта 2016 г.
- ^ «Шаблон проектирования Builder — структура и сотрудничество» . w3sDesign.com . Проверено 12 августа 2017 г.
Ссылки
[ редактировать ]- Гамма, Эрих ; Хельм, Ричард ; Джонсон, Ральф ; Влиссидес, Джон (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Аддисон-Уэсли. ISBN 0-201-63361-2 .
Внешние ссылки
[ редактировать ]