Объекты на диаграмме:
- Builder - абстрактный строитель, определяющий интерфейс
- Concrete Builder - предоставляет конкретную реализацию строителя. Конкретный строитель создает и собирает части объекта в единое целое.
- Director - класс Директора отвечает за задание корректной последовательности конструирования объекта. Класс получает Конкретного Строителя, как параметр, и выполняет необходимые операции с ним.
- Product - конечный продукт. Создается Директором с помощью Коннкретного Строителя
Мотивы применения паттерна:
- алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой
- процесс конструирования должен обеспечивать различные представления конструируемого объекта
Плюсы применения паттерна Строитель:
- изолирует код, реализующий конструирование и представление
- предоставляет полный контроль над процессом создания объекта
- позволяет независимо изменять ход процесса создания объекта
Пусть имеется код создания некоторого объекта. Со временем, объект меняется, добавляются новые вариации объекта, появляются новые методы. Без данного паттерна пришлось бы переписывать код создания объекта и его последующего использования столько раз, сколько произошло изменений и во всех местах, где этот объект создается. При использовании паттерна Строитель код и порядок создания объекта инкапсулирован в класс Конкретного Строителя. При изменении процесса создания изменить код придется только в одном месте - в этом Конкретном Строителе. При добавлении новой вариации объекта придется лишь добавить еще одного Конкретного Строителя.
Для чего нужен Директор? Опишем это на примере. Пусть подрядчик (Строитель) строит дом. Подрядчик знает, как нужно делать фундамент, возводить стены, делать стропила и класть крышу. Директор (распорядитель) говорит подрядчику, в какой последовательности это делать: сначала нужно заложить фундамент, затем стены, а после этого сделать крышу. В коде это будет выглядеть так:
public class HouseBuilder {
protected House house;
public House getHouse() {
return house;
}
public void createHouse() {
house = new House();
}
public abstract void buildFoundation();
public abstract void buildWalls();
public abstract void buildRoof();
}
public class Director {
public House constructHouse(HouseBuilder builder) {
builder.createHouse();
builder.buildFoundation();
builder.buildWalls();
builder.buildRoof();
return builder.getHouse();
}
}
Однако, если Директор плохой, то он может перепутать что-нибудь, и потребовать от Строителя сначала сделать крышу и стены, а потом возвести фундамент. В таком случае для Строителя будет безопаснее самому управлять ходом строительства, а для Директора оставить лишь одну функцию - пусть он командует, что надо построить дом. А Строитель уже сам сделает все, что надо в нужной последовательности. Код этого будет следующий:
public class HouseBuilder {
protected House house;
public House getHouse() {
return house;
}
public void createHouse() {
house = new House();
buildFoundation();
buildWalls();
buildRoof();
}
protected abstract void buildFoundation();
protected abstract void buildWalls();
protected abstract void buildRoof();
}
public class Director {
public House constructHouse(HouseBuilder builder) {
builder.createHouse();
return builder.getHouse();
}
}
В заключении можно добавить, что Строитель часто используется вместе с паттерном Компоновщик (Composite).
Я хочу поделиться свидетельством о том, как г-н Бенджамин помог мне с займом в 2 000 000,00 долларов США для финансирования моего проекта фермы по выращиванию марихуаны, я очень благодарен и пообещал поделиться этой законной финансирующей компанией с любым, кто ищет способ расширить свой бизнес-проект. .финансирующая компания. Любой, кто ищет финансовую поддержку, должен связаться с ними по адресу lfdsloans@outlook.com. Г-н Бенджамин также работает на WhatsApp 1-989-394-3740, чтобы облегчить задачу любому заявителю.
ОтветитьУдалить