本文源码:建造者模式 提取码: vpqt
目录结构
建议跟着一条学设计模式的小伙伴都建一个maven
工程,并安装lombok
依赖和插件。
并建立如下包目录,便于归纳整理。
pom
如下
org.projectlombok
lombok
1.16.10
开发场景
现在有一个手机的建造者,我要让它为我生产不用品牌和配置的手机。该怎么实现?
代码演示
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();
给谁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
- StringBuilder:
append();
给谁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