Шаблон дизайна (Серия Из 4 частей)
Когда использовать
- Чтобы избежать работы с несогласованным объектом, когда объект необходимо создать в несколько этапов.
- Чтобы избежать слишком большого количества аргументов конструктора.
- Для создания объекта, который должен быть неизменяемым.
- Чтобы инкапсулировать полную логику создания.
Намерение
Отделите построение сложного объекта от его представления, чтобы один и тот же процесс построения мог создавать разные представления.
Компоненты
- Класс Builder определяет абстрактный интерфейс для создания частей объекта продукта.
- Конкретный конструктор создает и объединяет части продукта, реализуя интерфейс конструктора. Он определяет и отслеживает создаваемое представление и предоставляет интерфейс для сохранения продукта.
- Класс Director создает сложный объект с помощью интерфейса конструктора.
- Продукт представляет собой сложный строящийся объект.
Структура
Реализация
1 Определите Изделие (Дом), которое собирается в шаблоне конструктора.
package com.gaurav.builder;
/* The house is the object that gets assembled in the builder pattern. */
public class House {
private String floorType;
private String wallType;
private String roofType;
public String getFloorType() {
return floorType;
}
public void setFloorType(String floorType) {
this.floorType = floorType;
}
public String getWallType() {
return wallType;
}
public void setWallType(String wallType) {
this.wallType = wallType;
}
public String getRoofType() {
return roofType;
}
public void setRoofType(String roofType) {
this.roofType = roofType;
}
public String toString() {
return new String("\nConstructing House \n FloorType: " + floorType
+ "\n WallType: " + wallType + "\n RoofType: " + roofType );
}
}
2 Определите интерфейс конструктора (или абстрактный класс) вместе с конкретными конструкторами. Интерфейс конструктора содержит методы для пошагового построения продукта. Он также имеет метод сборки для извлечения объекта продукта.
package com.gaurav.builder;
public interface HouseBuilder {
public HouseBuilder buildFloor();
public HouseBuilder buildWall();
public HouseBuilder buildRoof();
public House build();
}
3 Конкретные строители реализуют интерфейс строителя. Конкретный строитель отвечает за создание и сборку объекта продукта. Разные бетоностроители создают и собирают изделия по-разному.
package com.gaurav.builder;
public class ConcreteHouseBuilder implements HouseBuilder {
private House house;
public ConcreteHouseBuilder() {
house = new House();
}
public HouseBuilder buildFloor() {
house.setFloorType("concrete");
return this;
}
public HouseBuilder buildWall() {
house.setWallType("concrete");
return this;
}
public HouseBuilder buildRoof() {
house.setRoofType("concrete");
return this;
}
public House build() {
return house;
}
}
package com.gaurav.builder;
public class WoodenHouseBuilder implements HouseBuilder {
private House house;
public WoodenHouseBuilder() {
house = new House();
}
public HouseBuilder buildFloor() {
house.setFloorType("wood");
return this;
}
public HouseBuilder buildWall() {
house.setWallType("wood");
return this;
}
public HouseBuilder buildRoof() {
house.setRoofType("wood");
return this;
}
public House build() {
return house;
}
}
4 Объект-директор отвечает за создание Продукта. Он делает это через интерфейс Конструктора для конкретного конструктора. Он создает продукт с помощью различных методов построения. Класс director гарантирует, что все необходимые операции будут выполнены до того, как объект будет возвращен клиенту в “согласованном” состоянии.
package com.gaurav.builder;
public class HouseBuildDirector {
private HouseBuilder builder;
public HouseBuildDirector(final HouseBuilder builder) {
this.builder = builder;
}
public House construct() {
/* call the necessary methods and return the consistent object*/
return builder.buildFloor().buildWall().buildRoof().build();
}
}
5 Код клиента. Клиент использует различные объекты конструктора для создания различных типов продуктов. Однако процесс строительства такой же.
package com.gaurav.client;
import com.gaurav.builder.ConcreteHouseBuilder;
import com.gaurav.builder.HouseBuildDirector;
import com.gaurav.builder.HouseBuilder;
import com.gaurav.builder.WoodenHouseBuilder;
public class BuilderClient {
public static void main(final String[] arguments) {
/* Construct a concrete house */
HouseBuilder builder = new ConcreteHouseBuilder();
HouseBuildDirector carBuildDirector = new HouseBuildDirector(builder);
System.out.println(carBuildDirector.construct());
/* Construct a wooden house */
builder = new WoodenHouseBuilder();
carBuildDirector = new HouseBuildDirector(builder);
System.out.println(carBuildDirector.construct());
}
}
Output Constructing House FloorType: concrete WallType: concrete RoofType: concrete Constructing House FloorType: wood WallType: wood RoofType: wood
Выгоды
- Процесс строительства может контролироваться директором.
- Полезно, когда для создания объекта необходимо выполнить множество операций.
- Избегает Телескопического Шаблона Конструктора.
Недостатки
Не подходит, если требуется изменяемый объект.
Примеры из Реального Мира
Строительство дома – Нам нужно сказать архитектору, что все, что мы хотим, является частью здания. Затем архитектор проектирует и строит здание. Он будет передан только тогда, когда все будет реализовано. Мы не получаем “частично” построенный дом (что небезопасно).
Примеры Java SDK
java.lang. StringBuilder добавляет() java.язык. Добавление буфера строк() java.nio. ByteBuffer поставил() javax.качать. Групповой турнир. Группа AddComponent() java.lang. Добавляемые реализации
Надеюсь, тебе понравится. Хотелось бы услышать ваши мысли об этом шаблоне дизайна.
Шаблон дизайна (Серия Из 4 частей)
Оригинал: “https://dev.to/gauravratnawat/builder-pattern-2pk2”