小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
概述
通过多个简单的对象一步一步构建成一个复杂的对象,类比与lambok中的@builder
注解
将一些不变的条件抽离出来构建一个对象
封装一个对象的构造过程,并允许按步骤构造
使用场景
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
例如
比如造房子,钢筋、水泥、木材是一定需要的,就可以从钢筋、水泥、木材入手构建一个房子对象.薯片炸鸡可乐鸡块,可以构建成各种不同的套餐
比如@Builder
注解构建对象时候,可以针对类中的每个属性赋值,也就是针对每个简单的属性赋值,最后构建出一个完整的对象
Person.builder.name("tom").age(20).color("write").build;
逻辑实现
- 创建一个类A,这个A的属性很多,构造方法多种多样
- 在A中构造一个静态内部类ABuilder,其属性与A的属性一致
- ABuilder的构造方法参数是A的构造必须的参数
- ABuilder中有很多setXXX()的发放,返参还是ABuilder
- 有个build方法,返参是A
代码实现
public class A{
private final String color;//必须
private final String shape;//必须
private final int price;//可选
private final String detail;//可选
private final String tips;//可选
private A(ABuilder aBuilder){
this.color=aBuilder.color;
this.shape=aBuilder.shape;
this.price=aBuilder.price;
this.detail=aBuilder.detail;
this.tips=aBuilder.tips;
}
public static class ABuilder{
private String color;//必须
private String shape;//必须
private int price;//可选
private String detail;//可选
private String tips;//可选
public ABuilder(String color,String shape){
this.color=color;
this.shape=shape;
}
public ABuilder setPrice(int price) {
this.price = price;
return this;
}
public ABuilder setDetail(String detail) {
this.detail = detail;
return this;
}
public ABuilder setTips(String tips) {
this.tips = tips;
return this;
}
public A build(){
return new A(this);
}
}
//省略getter方法
}
A a=new A.ABuilder("red","圆")
.setPrice(1)
.setDetail("大")
.setTips("very nice")
.build();
lombok的builder注解就是这么实现的逻辑
还可以参考下StringBuilder的append和StringBuffer
还有一种更加规范的实现模式:通过Client、Director、Builder和Product形成的建造者模式
但是本质的特点和该逻辑是一致的,只是实现上更为的符合设计特点.更加抽象