设计模式之建造者模式

爱被打了一巴掌 2022-01-28 07:01 379阅读 0赞

一.介绍

1.建造者定义:

  1. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
  2. 用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道

2.类型:

  1. 创建型

3.适用场景:

  1. 如果一个对象有非常复杂的内部结构(很多属性)
  2. 想把复杂对象的创建和使用分离

4.优点:

  1. 封装性好,创建和使用分离
  2. 扩展性好,建造者之间独立,一定程度上解耦

5.缺点:

  1. 产生多余的Builder对象
  2. 产品内部发生变化,建造者都要修改,成本较大

二.demo演示

1.创建一个课程类和一些基本的属性

  1. public class Course {
  2. private String courseName;
  3. private String coursePPT;
  4. private String courseVideo;
  5. private String courseArticle;
  6. //问答
  7. private String courseQA;
  8. @Override
  9. public String toString() {
  10. return "Course{" +
  11. "courseName='" + courseName + '\'' +
  12. ", coursePPT='" + coursePPT + '\'' +
  13. ", courseVideo='" + courseVideo + '\'' +
  14. ", courseArticle='" + courseArticle + '\'' +
  15. ", courseQA='" + courseQA + '\'' +
  16. '}';
  17. }
  18. public String getCourseName() {
  19. return courseName;
  20. }
  21. public void setCourseName(String courseName) {
  22. this.courseName = courseName;
  23. }
  24. public String getCoursePPT() {
  25. return coursePPT;
  26. }
  27. public void setCoursePPT(String coursePPT) {
  28. this.coursePPT = coursePPT;
  29. }
  30. public String getCourseVideo() {
  31. return courseVideo;
  32. }
  33. public void setCourseVideo(String courseVideo) {
  34. this.courseVideo = courseVideo;
  35. }
  36. public String getCourseArticle() {
  37. return courseArticle;
  38. }
  39. public void setCourseArticle(String courseArticle) {
  40. this.courseArticle = courseArticle;
  41. }
  42. public String getCourseQA() {
  43. return courseQA;
  44. }
  45. public void setCourseQA(String courseQA) {
  46. this.courseQA = courseQA;
  47. }
  48. }

2.创建一个CourseBuilder抽象类,并且创建一些接口和制作课程的接口

  1. public abstract class CourseBuilder {
  2. public abstract void buildCourseName(String courseName);
  3. public abstract void buildCoursePPT(String coursePPT);
  4. public abstract void buildCourseVideo(String courseVideo);
  5. public abstract void buildCourseArticle(String courseArticle);
  6. public abstract void buildCourseQA(String courseQA);
  7. //制作课程
  8. public abstract Course makeCourse();
  9. }

3.创建CourseActualBuilder真正的实现者

  1. /**
  2. * 真正的创造者
  3. */
  4. public class CourseActualBuilder extends CourseBuilder{
  5. private Course course = new Course();
  6. @Override
  7. public void buildCourseName(String courseName) {
  8. course.setCourseName(courseName);
  9. }
  10. @Override
  11. public void buildCoursePPT(String coursePPT) {
  12. course.setCoursePPT(coursePPT);
  13. }
  14. @Override
  15. public void buildCourseVideo(String courseVideo) {
  16. course.setCourseVideo(courseVideo);
  17. }
  18. @Override
  19. public void buildCourseArticle(String courseArticle) {
  20. course.setCourseArticle(courseArticle);
  21. }
  22. @Override
  23. public void buildCourseQA(String courseQA) {
  24. course.setCourseQA(courseQA);
  25. }
  26. @Override
  27. public Course makeCourse() {
  28. return course;
  29. }
  30. }

4.创建Coach教练类,相当于指挥官协助讲师进行视频的制作

  1. public class Coach {
  2. private CourseBuilder courseBuilder;
  3. public void setCourseBuilder(CourseBuilder courseBuilder) {
  4. this.courseBuilder = courseBuilder;
  5. }
  6. public Course makeCourse(String courseName,String coursePPT,
  7. String courseVideo,String courseArticle,
  8. String courseQA){
  9. this.courseBuilder.buildCourseName(courseName);
  10. this.courseBuilder.buildCoursePPT(coursePPT);
  11. this.courseBuilder.buildCourseVideo(courseVideo);
  12. this.courseBuilder.buildCourseArticle(courseArticle);
  13. this.courseBuilder.buildCourseQA(courseQA);
  14. return this.courseBuilder.makeCourse();
  15. }
  16. }

5.测试

  1. public class Coach {
  2. private CourseBuilder courseBuilder;
  3. public void setCourseBuilder(CourseBuilder courseBuilder) {
  4. this.courseBuilder = courseBuilder;
  5. }
  6. public Course makeCourse(String courseName,String coursePPT,
  7. String courseVideo,String courseArticle,
  8. String courseQA){
  9. this.courseBuilder.buildCourseName(courseName);
  10. this.courseBuilder.buildCoursePPT(coursePPT);
  11. this.courseBuilder.buildCourseVideo(courseVideo);
  12. this.courseBuilder.buildCourseArticle(courseArticle);
  13. this.courseBuilder.buildCourseQA(courseQA);
  14. return this.courseBuilder.makeCourse();
  15. }
  16. }

结果不进行展示了,但是上面的缺点就是属性非常多会导致属性值设置混乱,所以要进行下面的升级

三.demo升级演示

1.创建Course课程类,属性和构造方法,创建CourseBuilder静态内部类,添加课程的属性,创建对应属性赋值的方法,最终返回仍为本类CourseBuilder,创建Course类的构造方法,并且把CourseBuilder以参数的形式传入,然后把静态内部类的中属性的值设置给Course类的成员变量

  1. public class Course {
  2. private String courseName;
  3. private String coursePPT;
  4. private String courseVideo;
  5. private String courseArticle;
  6. //问答
  7. private String courseQA;
  8. @Override
  9. public String toString() {
  10. return "Course{" +
  11. "courseName='" + courseName + '\'' +
  12. ", coursePPT='" + coursePPT + '\'' +
  13. ", courseVideo='" + courseVideo + '\'' +
  14. ", courseArticle='" + courseArticle + '\'' +
  15. ", courseQA='" + courseQA + '\'' +
  16. '}';
  17. }
  18. public Course(CourseBuilder courseBuilder) {
  19. this.courseName=courseBuilder.courseName;
  20. this.coursePPT=courseBuilder.coursePPT;
  21. this.courseVideo=courseBuilder.courseVideo;
  22. this.courseArticle=courseBuilder.courseArticle;
  23. this.courseQA=courseBuilder.courseQA;
  24. }
  25. public static class CourseBuilder{
  26. private String courseName;
  27. private String coursePPT;
  28. private String courseVideo;
  29. private String courseArticle;
  30. //问答
  31. private String courseQA;
  32. public CourseBuilder buildCourseName(String courseName){
  33. this.courseName=courseName;
  34. return this;
  35. }
  36. public CourseBuilder buildCoursePPT(String coursePPT){
  37. this.coursePPT=coursePPT;
  38. return this;
  39. }
  40. public CourseBuilder buildCourseVideo(String courseVideo){
  41. this.courseVideo=courseVideo;
  42. return this;
  43. }
  44. public CourseBuilder buildCourseArticle(String courseArticle){
  45. this.courseArticle=courseArticle;
  46. return this;
  47. }
  48. public CourseBuilder buildCourseQA(String courseQA){
  49. this.courseQA=courseQA;
  50. return this;
  51. }
  52. public Course build(){
  53. return new Course(this);
  54. }
  55. }
  56. }

2.测试

public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().buildCourseName(“java设计模式”)
.buildCourseVideo(“java视频”).buildCoursePPT(“设计模式的PPT”)
.buildCourseArticle(“设计模式文章”).build();
System.out.println(course);
}
}

3.总结:
升级之后的方法好处就是会为对应的属性赋值,不会产生混乱的现象,原理就是,通过内部类的方法赋值给内部类的属性,然后在Course类的构造初始化的时候把内部类属性的值赋值给Course属性的值,最后通过builde方法返回当前已经赋过值的对象.

四.源码中的应用

1.在StringBuilder中的append方法使用的就是标准的建造者模式

  1. @Override
  2. public StringBuilder append(String str) {
  3. super.append(str);
  4. return this;
  5. }
  6. public StringBuilder append(StringBuffer sb) {
  7. super.append(sb);
  8. return this;
  9. }
  10. @Override
  11. public StringBuilder append(CharSequence s) {
  12. super.append(s);
  13. return this;
  14. }

还有很多append方法,想看的可以自己研究一下

2.Set的实现类ImmutableSet抽象类,看Builder类可以知道是一个标准的建造者模式

  1. public static class Builder<E> extends ImmutableCollection.ArrayBasedBuilder<E> {
  2. public Builder() {
  3. this(DEFAULT_INITIAL_CAPACITY);
  4. }
  5. Builder(int capacity) {
  6. super(capacity);
  7. }
  8. @CanIgnoreReturnValue
  9. @Override
  10. public Builder<E> add(E element) {
  11. super.add(element);
  12. return this;
  13. }
  14. .....

至此,建造者模式的讲解到此结束.

发表评论

表情:
评论列表 (有 0 条评论,379人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式建造模式

    建造者模式也是创建型模式中的一种,所谓的创建型模式,指的是如何创建对象,关注的是对象的创建过程。 建造者模式是将一个复杂对象分解成多个相对简单的子模块进行创建,比如游戏中常见

    相关 设计模式——建造模式

    > 设计模式: > > 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案