经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java中常用的设计模式之建造者模式详解
来源:jb51  时间:2022/2/28 8:51:14  对本文有异议

优点

1.建造者独立,易扩展。

2.便于控制细节风险。

缺点

1.产品必须有共同点,范围有限制。

2.如内部变化复杂,会有很多的建造类。

使用场景

1.需要生成的对象具有复杂的内部结构。

2.需要生成的对象内部属性本身相互依赖。

一、实现方式

  1. package com.asurplus.common.builder.style1;
  2. public class UserInfo {
  3. private String name;
  4. private int age;
  5. /**
  6. * 创建一个新的建造者
  7. *
  8. * @return
  9. */
  10. public static UserInfoBuilder builder() {
  11. return new UserInfoBuilder();
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. @Override
  26. public String toString() {
  27. return "UserInfo{" +
  28. "name='" + name +
  29. ", age=" + age +
  30. '}';
  31. }
  32. /**
  33. * 建造者内部类
  34. */
  35. public static class UserInfoBuilder {
  36. private String name;
  37. private int age;
  38. public UserInfoBuilder name(String name) {
  39. this.name = name;
  40. return this;
  41. }
  42. public UserInfoBuilder age(int age) {
  43. this.age = age;
  44. return this;
  45. }
  46. /**
  47. * 创建一个新的实例对象并赋值
  48. *
  49. * @return
  50. */
  51. public UserInfo build() {
  52. UserInfo userInfo = new UserInfo();
  53. userInfo.setName(this.name);
  54. userInfo.setAge(this.age);
  55. return userInfo;
  56. }
  57. }
  58. }

我们定义了一个 UserInfo 类,有 name,age 两个属性,还定义了一个静态内部类 UserInfoBuilder,帮助我们建造 UserInfo,并提供链式调用的方法。

二、实现方式

1、引入依赖

  1. <!-- lombok插件 -->
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. <optional>true</optional>
  6. </dependency>

Lombok 需要在 IDEA 中安装插件,具体方法,请百度。

2、实现

  1. package com.asurplus.common.builder.style2;
  2. import lombok.Builder;
  3. import lombok.Data;
  4. /**
  5. * get set toString 方法注解
  6. */
  7. @Data
  8. /**
  9. * 建造者模式注解
  10. */
  11. @Builder
  12. public class UserInfo2 {
  13. private String name;
  14. private int age;
  15. }

基于 Lombok 的注解,我们省略了大部分代码,但是具体的实现方式和我们的方式一是一模一样的,调用方法也是一样的。

三、测试

  1. package com.asurplus.common.builder;
  2. import com.asurplus.common.builder.style1.UserInfo;
  3. import com.asurplus.common.builder.style2.UserInfo2;
  4. /**
  5. * 建造者模式
  6. */
  7. public class TestMain {
  8. public static void main(String[] args) {
  9. // 手写的方式
  10. UserInfo userInfo = UserInfo.builder().name("张三").age(20).build();
  11. System.out.println(userInfo);
  12. // 注解的方式
  13. UserInfo2 userInfo2 = UserInfo2.builder().name("李四").age(30).build();
  14. System.out.println(userInfo2);
  15. }
  16. }

输出结果

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!   

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号