Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Привет всем, я ~
Предыдущие «народные шаблоны проектирования» были отложены из-за работы, и теперь они снова отправляются в плавание, и они соответствуютАнализ исходного кода фреймворкаЕшьте вместе, идеальное сочетание теории и практики.
Студенты, которые не очень хорошо знакомы с шаблонами проектирования, могут сначала взглянуть«Интерпретация 23 шаблонов проектирования в одном предложении»Имейте полное представление о шаблонах проектирования, сформируйте общую структуру, а затем разберите их один за другим.
Предыдущий периодрежим прототипаПосле релиза я получил благодарность от фанатов, и у меня появилось больше мотивации творить.
Давайте посмотрим сегоднярежим строителя, который также является узором творческого дизайна.
определение
официальное определение
Отделение построения сложного объекта от его представления позволяет одному и тому же процессу построения создавать разные представления.
популярная интерпретация
Предоставляет способ создания объектов со сложными деталями, которые должны быть доступны пользователям.Маскируйте процесс, не скрывая деталей.
Подобно строительству дома, вам нужно только предоставить материалы и проектные чертежи рабочим, чтобы построить желаемый дом, не обращая внимания на процесс строительства дома рабочими, но мы можем сами спроектировать детали.
Структурная схема
демонстрация кода
Исходный код этой статьи:режим строителяКод извлечения: vpqt
Структура каталогов
Рекомендуется следовать за небольшим партнером, который изучает шаблоны проектирования, чтобы построить одинmaven
работает и устанавливаетlombok
Зависимости и плагины.
И создайте следующий каталог пакетов для легкой сортировки.
pom
следующим образом
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
сцена разработки
Теперь есть сборщик сотовых телефонов, который я хочу сделать для себя независимо от марки и комплектации. Как этого добиться?
демонстрация кода
1. Создайте класс мобильного телефона
@Data
public class Phone {
//处理器
protected String cpu;
//内存
protected String mem;
//磁盘
protected String disk;
//屏幕大小
protected String size;
}
2. Создайте интерфейс конструктора
//定义建造者的模板方法
public interface Builder {
Phone phone = new Phone();
void buildCpu(String cpu);
void buildMem(String mem);
void buildDisk(String disk);
void buildSize(String size);
default Phone getPhone(){
return phone;
}
}
3. СоздатьVivo
сборщик сотовых телефонов
public class VivoPhoneBuilder implements Builder{
//建造者细节的实现
@Override
public void buildCpu(String cpu) {
phone.cpu=cpu;
}
@Override
public void buildMem(String mem) {
phone.mem=mem;
}
@Override
public void buildDisk(String disk) {
phone.disk=disk;
}
@Override
public void buildSize(String size) {
phone.size=size;
}
}
4. Создайте тестовый класс
public class MainTest {
public static void main(String[] args) {
VivoPhoneBuilder builder = new VivoPhoneBuilder();
builder.buildCpu("888");
builder.buildDisk("512");
builder.buildMem("16");
builder.buildSize("plus");
Phone phone = builder.getPhone();
System.out.println(phone);
}
}
5. Вывод результатов
Если мне нужно произвести в это времяOPPO
мобильный телефон, просто создайте новыйOppoPhoneBuilder
выполнитьBuilder
интерфейс.
цепной вызов
Я считаю, что с таким кодом в разработке сталкивался каждый, и его можно все время вызывать как цепочку.
Итак, как добитьсястроитель цепиШерстяная ткань?
Есть два способа:
1. Изменить возвращаемое значениеBuilder
public interface Builder {
Phone phone = new Phone();
// void 改为 Builder 同步修改实现类
Builder buildCpu(String cpu);
Builder buildMem(String mem);
Builder buildDisk(String disk);
Builder buildSize(String size);
default Phone getPhone(){
return phone;
}
}
Тест 1
public class MainTest {
public static void main(String[] args) {
// ……
VivoPhoneBuilder builder2 = new VivoPhoneBuilder();
Phone phone1 = builder2
.buildCpu("888")
.buildDisk("512")
.buildMem("16")
.buildSize("plus")
.getPhone();
System.out.println("phone1:"+phone1);
}
}
результат 1
2. Используйтеlombok
@Data
@Builder //使用链式建造者
@NoArgsConstructor
@AllArgsConstructor
public class Phone {
// ……
}
Тест 2
public class MainTest {
public static void main(String[] args) {
// ……
Phone build = Phone.builder()
.cpu("888")
.mem("16")
.disk("512")
.size("plus").build();
System.out.println("builder:"+build);
}
}
результат 2
Сценарии применения
- StringBuilder:
append();
К кому добавить?
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
- Swagger-ApiBuilder;
- Быстрая реализация:
Lombok-@Builder
Суммировать
режим строителяОбеспечивает различные представления одного и того же процесса сборки, создавая объекты, подобные конвейеру. Для новых добавленных объектов вам нужно только создать соответствующий билдер без изменения исходного кода.
lombok
предоставляет намрежим строителяБыстрая реализация (@Builder
), которые будут применяться к фактическому кодированию.