Определение режима строителя
Режим строителя называется режимом строителя на китайском языке, также известным как режим генератора.Он относится к режиму создания объекта.Он отделяет построение сложного объекта от его представления, так что один и тот же процесс построения может создавать разные представления. Шаблон построителя предназначен для пошагового создания сложного объекта, он позволяет пользователю создавать сложные объекты, указывая только их тип и содержимое, пользователю не нужно знать конкретные детали конструкции внутри. На следующем рисунке представлена общая диаграмма классов шаблона построителя:
В режиме строителя есть 4 роли:- Продукт: Роль продукта
- Builder: абстрактный строитель, определяющий интерфейс продукта
- ConcreteBuilder: сборщик бетона, реализует интерфейс, определенный Builder, и возвращает собранный продукт.
- Директор: Командир здесь принадлежит боссу, вы можете найти его напрямую для любого продукта, который вам нужно произвести.
Режим конструктора примеров приложений
улучшение дома
Будь то твердый переплет или простой, процесс улучшения дома относительно фиксирован, поэтому он подходит для режима строителя. Давайте возьмем улучшение дома в качестве примера, чтобы узнать о модели строителя. На следующем рисунке показана простая диаграмма UML шаблона строителя для улучшения дома.
1. Класс предметов домашнего обихода
/**
* 家装对象类
*/
public class House {
// 买家电
private String jiadian;
// 买地板
private String diban;
// 买油漆
private String youqi;
public String getJiadian() {
return jiadian;
}
public void setJiadian(String jiadian) {
this.jiadian = jiadian;
}
public String getDiban() {
return diban;
}
public void setDiban(String diban) {
this.diban = diban;
}
public String getYouqi() {
return youqi;
}
public void setYouqi(String youqi) {
this.youqi = youqi;
}
@Override
public String toString() {
return "House{" +
"jiadian='" + jiadian + '\'' +
", diban='" + diban + '\'' +
", youqi='" + youqi + '\'' +
'}';
}
}
2. Класс "Строитель абстрактных объектов"
/**
* 抽象建造者
*/
public interface HouseBuilder {
// 买家电
void doJiadian();
// 买地板
void doDiBan();
// 买油漆
void doYouqi();
House getHouse();
}
3. Бетонщики - простые строители
/**
* 简装创建者
*/
public class JianzhuangBuilder implements HouseBuilder {
private House house = new House();
@Override
public void doJiadian() {
house.setJiadian("简单家电就好");
}
@Override
public void doDiBan() {
house.setDiban("普通地板");
}
@Override
public void doYouqi() {
house.setYouqi("污染较小的油漆就行");
}
@Override
public House getHouse() {
return house;
}
}
4. Бетонщики - строители в твердом переплете
/**
* 精装创建者
*/
public class jingzhuangBuilder implements HouseBuilder {
private House house = new House();
@Override
public void doJiadian() {
house.setJiadian("二话不说,最好的");
}
@Override
public void doDiBan() {
house.setDiban("二话不说,实木地板");
}
@Override
public void doYouqi() {
house.setYouqi("二话不说,给我来0污染的");
}
@Override
public House getHouse() {
return house;
}
}
5. Командир - Компания по благоустройству дома
/**
* 家装公司,值需要告诉他精装还是简装
*/
public class HouseDirector {
public House builder(HouseBuilder houseBuilder){
houseBuilder.doDiBan();
houseBuilder.doJiadian();
houseBuilder.doYouqi();
return houseBuilder.getHouse();
}
}
6. Тест
public class App {
public static void main(String[] args) {
house();
}
public static void house(){
HouseDirector houseDirector = new HouseDirector();
// 简装
JianzhuangBuilder jianzhuangBuilder = new JianzhuangBuilder();
System.out.println("我要简装");
System.out.println(houseDirector.builder(jianzhuangBuilder));
// 精装
jingzhuangBuilder jingzhuangBuilder = new jingzhuangBuilder();
System.out.println("我要精装");
System.out.println(houseDirector.builder(jingzhuangBuilder));
}
}
выходной результат
Взяв в качестве примера улучшение дома, мы разработали два специальных конструктора: простой конструктор и конструктор в твердом переплете. Нам просто нужно сказать в компании по ремонту дома, нужно ли мне легкое или твердое покрытие, и он устроит это для нас.Мне не нужно знать конкретные детали. Как насчет того, выучили ли вы шаблон строителя?
строительство объекта
В повседневной разработке вы часто видите следующий код:
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.curry.springbootswagger.controller"))
.paths(PathSelectors.any())
.build();
Это очень красиво? Изучив режим Строителя, вы также сможете строить объекты таким же образом. Это достигается за счет режима построителя вариантов. Сначала не объясняйте, давайте сначала воспользуемся режимом Builder для создания с помощью вышеуказанного объекта, используя в качестве примера студенческий класс.
Студенты объектный код:
public class Student {
private String name;
private int age;
private int num;
private String email;
// 提供一个静态builder方法
public static Student.Builder builder() {
return new Student.Builder();
}
// 外部调用builder类的属性接口进行设值。
public static class Builder{
private String name;
private int age;
private int num;
private String email;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder num(int num) {
this.num = num;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public Student build() {
// 将builder对象传入到学生构造函数
return new Student(this);
}
}
// 私有化构造器
private Student(Builder builder) {
name = builder.name;
age = builder.age;
num = builder.num;
email = builder.email;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", num=" + num +
", email='" + email + '\'' +
'}';
}
}
код вызова:
public static void student(){
Student student = Student.builder().name("平头哥").num(1).age(18).email("平头哥@163.com").build();
System.out.println(student);
}
Как видите, вариант шаблона Builder включает в себя следующее:
- Создайте статический внутренний класс Builder внутри класса, который вы хотите построить.
- Параметры статического внутреннего класса такие же, как и у строительного класса.
- Параметр конструкции класса сборки является статическим внутренним классом, а переменные статического внутреннего класса назначаются классу сборки одна за другой.
- Статический внутренний класс предоставляет метод установки параметров, а возвращаемое значение — текущий объект Builder.
- Предоставляет метод построения конечных классов объектов Build Build Consust. Параметр является текущим целевым строителем
Вы можете сказать, что этот метод написания слишком громоздкий для реализации и требует от нас написания большого количества дополнительного кода.К счастью, предшественники разработалиlombok
чтобы спасти нас, нам просто нужно представитьlombok
плагин, затем добавьте класс сущности@Builder
Аннотация, вы можете использовать шаблон Builder для создания объектов.
Преимущества и недостатки шаблона Builder
преимущество
- В режиме конструктора клиенту не нужно знать детали внутреннего состава продукта, сам продукт и процесс создания продукта развязаны, так что один и тот же процесс создания может создавать разные объекты продукта.
- Каждый конкретный построитель относительно независим и не имеет ничего общего с другими конкретными построителями, поэтому можно легко заменить конкретный построитель или добавить новый конкретный построитель, и пользователи могут получать разные объекты продукта, используя разные конкретные построители.
- Более детальный контроль над процессом создания продукта. Разбивка этапов создания сложных продуктов на различные методы делает процесс создания более понятным и упрощает использование программ для управления процессом создания.
- Добавление нового конкретного построителя не требует изменения кода исходной библиотеки классов, класс командира запрограммирован для класса абстрактного построителя, система легко расширяется и соответствует «открытому и закрытому принципу».
недостаток
- Продукты, созданные в режиме конструктора, как правило, имеют больше общего, и их компоненты похожи.Если различия между продуктами велики, режим строителя не подходит для использования, поэтому его область применения ограничена.
- Если внутренние изменения продукта сложны, это может привести к необходимости определить множество конкретных классов построителей для реализации таких изменений, что приведет к очень большой системе.
Что касается недостатков статьи, я надеюсь, что вы можете дать больше указаний, учиться вместе и вместе добиваться прогресса.
Наконец
Сделайте небольшую рекламу, добро пожаловать, чтобы отсканировать код и подпишитесь на общедоступную учетную запись WeChat: «Технический блог брата Пинтоу», давайте вместе добьемся прогресса.