• 4、建造者模式


    一、创建型模式

        4、建造者模式

            (1)、概述

                将一个复杂的对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。

                当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

            (2)、建造者模式应用

    1. public class MaterialOrderBuilder {
    2. private ConsultDto consultDto;
    3. private CurrentUser currentUser;
    4. public MaterialOrderBuilder setConsultDto(ConsultDto consultDto){
    5. this.consultDto = consultDto;
    6. return this;
    7. }
    8. public MaterialOrderBuilder setCurrentUser(CurrentUser currentUser){
    9. this.currentUser = currentUser;
    10. return this;
    11. }
    12. /**
    13. * 构建方法
    14. * @return
    15. */
    16. public MaterialOrderDto build(){
    17. MaterialOrderDto materialOrderDto = new MaterialOrderDto();
    18. this.buildWithCurrentUser(materialOrderDto);
    19. this.buildWithConsultDto(materialOrderDto);
    20. this.buildOthers(materialOrderDto);
    21. return materialOrderDto;
    22. }
    23. private void buildWithCurrentUser(MaterialOrderDto materialOrderDtoReturn){
    24. if(NullUtil.isEmpty(currentUser)){
    25. return;
    26. }
    27. materialOrderDtoReturn.setTenantId(currentUser.getTenantId());
    28. ......
    29. }
    30. private void buildWithConsultDto(MaterialOrderDto materialOrderDtoReturn){
    31. if(NullUtil.isEmpty(consultDto)){
    32. return;
    33. }
    34. materialOrderDtoReturn.setVisitType(consultDto.getVisitType());
    35. ......
    36. }
    37. private void buildOthers(MaterialOrderDto materialOrderDtoReturn) {
    38. materialOrderDtoReturn.setId(UUIDUtil.getUUID());
    39. ......
    40. }
    41. }
    42. /**
    43. * 建造者模式应用
    44. * @return
    45. */
    46. public static void main(String[] args) {
    47. //构建物资对接单对象
    48. MaterialOrderDto materialOrderDto = new MaterialOrderBuilder()
    49. .setConsultDto(consultDto)
    50. .setCurrentUser(currentUser)
    51. .build();
    52. }

            (3)、借助lombok.Builder实现建造者模式

    1. import lombok.Builder;
    2. @Builder
    3. public class DeliveryTaskBuilder {
    4. private Consult consult;
    5. private DoctorAdvice doctorAdvice;
    6. private AdviceFees adviceFees;
    7. private Integer status;
    8. /**
    9. * 医嘱build方法
    10. * @return
    11. */
    12. public DeliveryTask adviceBuild(){
    13. DeliveryTask deliveryTask = new DeliveryTask();
    14. this.buildWithConsult(deliveryTask);
    15. this.buildWithDoctorAdvice(deliveryTask);
    16. this.buildWithRecipe(deliveryTask);
    17. this.buildWithAdviceFees(deliveryTask);
    18. this.buildAdviceOthers(deliveryTask);
    19. return deliveryTask;
    20. }
    21. /**
    22. * 补费build方法
    23. * @return
    24. */
    25. public DeliveryTask feesBuild(){
    26. DeliveryTask deliveryTask = new DeliveryTask();
    27. this.buildWithConsult(deliveryTask);
    28. this.buildWithAdviceFees(deliveryTask);
    29. this.buildFeesOthers(deliveryTask);
    30. return deliveryTask;
    31. }
    32. private void buildWithConsult(DeliveryTask deliveryTask){
    33. if(NullUtil.isEmpty(consult)){
    34. return;
    35. }
    36. deliveryTask.setType(consult.getVisitType());
    37. deliveryTask.setPatientId(consult.getPatientId());
    38. ......
    39. }
    40. private void buildWithDoctorAdvice(DeliveryTask deliveryTask){
    41. if(NullUtil.isEmpty(doctorAdvice)){
    42. return;
    43. }
    44. deliveryTask.setCount(doctorAdvice.getCount());
    45. ......
    46. }
    47. private void buildWithAdviceFees(DeliveryTask deliveryTask){
    48. if(NullUtil.isEmpty(adviceFees)){
    49. return;
    50. }
    51. deliveryTask.setServiceId(adviceFees.getServiceId());
    52. deliveryTask.setUnitId(adviceFees.getCountUnitId());
    53. deliveryTask.setFootnote(adviceFees.getFootnote());
    54. ......
    55. }
    56. private void buildWithRecipe(DeliveryTask deliveryTask){
    57. if(NullUtil.isEmpty(recipe)){
    58. return;
    59. }
    60. deliveryTask.setOrderId(recipe.getRecipeId());
    61. deliveryTask.setOrderCode(recipe.getRecipeCode());
    62. ......
    63. }
    64. private void buildAdviceOthers(DeliveryTask deliveryTask) {
    65. deliveryTask.setStatus(status);
    66. ......
    67. }
    68. private void buildFeesOthers(DeliveryTask deliveryTask) {
    69. deliveryTask.setStatus(status);
    70. ......
    71. }
    72. }
    73. /**
    74. * lombok.Builder建造者模式应用
    75. * @return
    76. */
    77. public static void main(String[] args) {
    78. //构建出库任务
    79. DeliveryTask deliveryTask = DeliveryTaskBuilder.builder()
    80. .consult(recipeAttribute.getConsult())
    81. .doctorAdvice(adviceGroupFees.getDoctorAdvice())
    82. .adviceFees(adviceFees)
    83. .recipe(adviceGroupFees.getRecipe())
    84. .status(DeliveryTaskConstant.deliveryTaskStatus.INIT_STATUA)
    85. .build()
    86. .adviceBuild();
    87. }

                ①、People使用注解@Builder、@AllArgsConstructor(access = AccessLevel.PRIVATE)、@ToString

    1. @Builder
    2. @ToString
    3. @AllArgsConstructor(access = AccessLevel.PRIVATE)
    4. public class People {
    5. private String name;
    6. private String sex;
    7. private int age;
    8. }

                ②、类People经过反编译后

                    @AllArgsConstructor(access = AccessLevel.PRIVATE)注解将People构造方法标识为private

    1. public class People {
    2. private String name;
    3. private String sex;
    4. private int age;
    5. private People(String name, String sex, int age) {
    6. this.name = name;
    7. this.sex = sex;
    8. this.age = age;
    9. }
    10. //生成的builder()方法
    11. public static People.PeopleBuilder builder() {
    12. return new People.PeopleBuilder();
    13. }
    14. //生成的内部类
    15. public static class PeopleBuilder {
    16. private String name;
    17. private String sex;
    18. private int age;
    19. PeopleBuilder() {
    20. }
    21. public People.PeopleBuilder name(String name) {
    22. this.name = name;
    23. return this;
    24. }
    25. public People.PeopleBuilder sex(String sex) {
    26. this.sex = sex;
    27. return this;
    28. }
    29. public People.PeopleBuilder age(int age) {
    30. this.age = age;
    31. return this;
    32. }
    33. //生成的build()方法
    34. public People build() {
    35. return new People(this.name, this.sex, this.age);
    36. }
    37. public String toString() {
    38. return "People.PeopleBuilder(name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ")";
    39. }
    40. }
    41. public String toString() {
    42. return "People(name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ")";
    43. }
    44. }

  • 相关阅读:
    Cesium 展示——颜色使用汇总集合
    esp8266 通过Arduino与电脑串口通信
    python使用execjs利用jsdom来执行含有document的js代码方案(上)
    2022NewStarCTF pwn大部分题解
    学 Python 都用来干嘛的?
    【Linux】GDB调试器学起来!指令全解,建议收藏
    LoadingCache
    Python正则表达式(一看就懂)
    python基础语法14-GUI编程2
    k8s-----数据存储
  • 原文地址:https://blog.csdn.net/L_D_Y_K/article/details/126836999