一、创建型模式
4、建造者模式
(1)、概述
将一个复杂的对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
(2)、建造者模式应用
public class MaterialOrderBuilder {
private ConsultDto consultDto;
private CurrentUser currentUser;
public MaterialOrderBuilder setConsultDto(ConsultDto consultDto){
this.consultDto = consultDto;
return this;
}
public MaterialOrderBuilder setCurrentUser(CurrentUser currentUser){
this.currentUser = currentUser;
return this;
}
/**
* 构建方法
* @return
*/
public MaterialOrderDto build(){
MaterialOrderDto materialOrderDto = new MaterialOrderDto();
this.buildWithCurrentUser(materialOrderDto);
this.buildWithConsultDto(materialOrderDto);
this.buildOthers(materialOrderDto);
return materialOrderDto;
}
private void buildWithCurrentUser(MaterialOrderDto materialOrderDtoReturn){
if(NullUtil.isEmpty(currentUser)){
return;
}
materialOrderDtoReturn.setTenantId(currentUser.getTenantId());
......
}
private void buildWithConsultDto(MaterialOrderDto materialOrderDtoReturn){
if(NullUtil.isEmpty(consultDto)){
return;
}
materialOrderDtoReturn.setVisitType(consultDto.getVisitType());
......
}
private void buildOthers(MaterialOrderDto materialOrderDtoReturn) {
materialOrderDtoReturn.setId(UUIDUtil.getUUID());
......
}
}
/**
* 建造者模式应用
* @return
*/
public static void main(String[] args) {
//构建物资对接单对象
MaterialOrderDto materialOrderDto = new MaterialOrderBuilder()
.setConsultDto(consultDto)
.setCurrentUser(currentUser)
.build();
}
(3)、借助lombok.Builder实现建造者模式
import lombok.Builder;
@Builder
public class DeliveryTaskBuilder {
private Consult consult;
private DoctorAdvice doctorAdvice;
private AdviceFees adviceFees;
private Integer status;
/**
* 医嘱build方法
* @return
*/
public DeliveryTask adviceBuild(){
DeliveryTask deliveryTask = new DeliveryTask();
this.buildWithConsult(deliveryTask);
this.buildWithDoctorAdvice(deliveryTask);
this.buildWithRecipe(deliveryTask);
this.buildWithAdviceFees(deliveryTask);
this.buildAdviceOthers(deliveryTask);
return deliveryTask;
}
/**
* 补费build方法
* @return
*/
public DeliveryTask feesBuild(){
DeliveryTask deliveryTask = new DeliveryTask();
this.buildWithConsult(deliveryTask);
this.buildWithAdviceFees(deliveryTask);
this.buildFeesOthers(deliveryTask);
return deliveryTask;
}
private void buildWithConsult(DeliveryTask deliveryTask){
if(NullUtil.isEmpty(consult)){
return;
}
deliveryTask.setType(consult.getVisitType());
deliveryTask.setPatientId(consult.getPatientId());
......
}
private void buildWithDoctorAdvice(DeliveryTask deliveryTask){
if(NullUtil.isEmpty(doctorAdvice)){
return;
}
deliveryTask.setCount(doctorAdvice.getCount());
......
}
private void buildWithAdviceFees(DeliveryTask deliveryTask){
if(NullUtil.isEmpty(adviceFees)){
return;
}
deliveryTask.setServiceId(adviceFees.getServiceId());
deliveryTask.setUnitId(adviceFees.getCountUnitId());
deliveryTask.setFootnote(adviceFees.getFootnote());
......
}
private void buildWithRecipe(DeliveryTask deliveryTask){
if(NullUtil.isEmpty(recipe)){
return;
}
deliveryTask.setOrderId(recipe.getRecipeId());
deliveryTask.setOrderCode(recipe.getRecipeCode());
......
}
private void buildAdviceOthers(DeliveryTask deliveryTask) {
deliveryTask.setStatus(status);
......
}
private void buildFeesOthers(DeliveryTask deliveryTask) {
deliveryTask.setStatus(status);
......
}
}
/**
* lombok.Builder建造者模式应用
* @return
*/
public static void main(String[] args) {
//构建出库任务
DeliveryTask deliveryTask = DeliveryTaskBuilder.builder()
.consult(recipeAttribute.getConsult())
.doctorAdvice(adviceGroupFees.getDoctorAdvice())
.adviceFees(adviceFees)
.recipe(adviceGroupFees.getRecipe())
.status(DeliveryTaskConstant.deliveryTaskStatus.INIT_STATUA)
.build()
.adviceBuild();
}
①、People使用注解@Builder、@AllArgsConstructor(access = AccessLevel.PRIVATE)、@ToString
@Builder
@ToString
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class People {
private String name;
private String sex;
private int age;
}
②、类People经过反编译后
@AllArgsConstructor(access = AccessLevel.PRIVATE)注解将People构造方法标识为private
public class People {
private String name;
private String sex;
private int age;
private People(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
//生成的builder()方法
public static People.PeopleBuilder builder() {
return new People.PeopleBuilder();
}
//生成的内部类
public static class PeopleBuilder {
private String name;
private String sex;
private int age;
PeopleBuilder() {
}
public People.PeopleBuilder name(String name) {
this.name = name;
return this;
}
public People.PeopleBuilder sex(String sex) {
this.sex = sex;
return this;
}
public People.PeopleBuilder age(int age) {
this.age = age;
return this;
}
//生成的build()方法
public People build() {
return new People(this.name, this.sex, this.age);
}
public String toString() {
return "People.PeopleBuilder(name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ")";
}
}
public String toString() {
return "People(name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ")";
}
}