建造者模式

建造者模式

1. 概念

  1. 定义

    将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

  2. 使用场景

    • 当对象有复杂的内部结构(很多属性)
    • 当创造一个对象 需要很多步骤时 , 适合使用建造者模式 ; 当创造一个对象 只需要一个简单的方法就可以完成 , 适合使用工厂模式
  3. 优缺点

    • 优点:

      • 创建和使用分离
      • 建造类之间 相互独立 , 在 一定程度上解耦 ;
    • 缺点 :

      • 增加类数量 : 产生多余的 Builder 对象 ;

      • 内部修改困难 : 如果 产品内部发生变化 , 建造者也要相应修改 ;

  4. 建造者模式 与 工厂模式 :

    • 注重点不同 : 建造者模式 更注重于 方法的调用顺序 ; 工厂模式 注重于 创建产品 , 不关心方法调用的顺序 ;

    • 创建对象力度不同 : 创建对象的力度不同 , 建造者模式可以创建复杂的产品 , 由各种复杂的部件组成 , 工厂模式创建出来的都是相同的实例对象 ,

2. 代码

教师创建课程

2.1 版本1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Coach {
private CourseBuilder courseBuilder;

public void setCourseBuilder(CourseBuilder courseBuilder) {
this.courseBuilder = courseBuilder;
}

public Course makeCourse(String courseName,String coursePPT,
String courseVideo,String courseArticle,
String courseQA){
this.courseBuilder.buildCourseName(courseName);
this.courseBuilder.buildCoursePPT(coursePPT);
this.courseBuilder.buildCourseVideo(courseVideo);
this.courseBuilder.buildCourseArticle(courseArticle);
this.courseBuilder.buildCourseQA(courseQA);
return this.courseBuilder.makeCourse();
}
}
1
2
3
4
5
6
7
8
9
10
11
public abstract class CourseBuilder {

public abstract void buildCourseName(String courseName);
public abstract void buildCoursePPT(String coursePPT);
public abstract void buildCourseVideo(String courseVideo);
public abstract void buildCourseArticle(String courseArticle);
public abstract void buildCourseQA(String courseQA);

public abstract Course makeCourse();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class CourseActualBuilder extends CourseBuilder {

private Course course = new Course();

@Override
public void buildCourseName(String courseName) {
course.setCourseName(courseName);
}

@Override
public void buildCoursePPT(String coursePPT) {
course.setCoursePPT(coursePPT);
}

@Override
public void buildCourseVideo(String courseVideo) {
course.setCourseVideo(courseVideo);
}

@Override
public void buildCourseArticle(String courseArticle) {
course.setCourseArticle(courseArticle);
}

@Override
public void buildCourseQA(String courseQA) {
course.setCourseQA(courseQA);
}

@Override
public Course makeCourse() {
return course;
}
}
1
2
3
4
5
6
7
8
9
10
@Data
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;

//question & answer
private String courseQA;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
public static void main(String[] args) {
CourseBuilder courseBuilder = new CourseActualBuilder();
Coach coach = new Coach();
coach.setCourseBuilder(courseBuilder);

Course course = coach.makeCourse("Java设计模式精讲",
"Java设计模式精讲PPT",
"Java设计模式精讲视频",
"Java设计模式精讲手记",
"Java设计模式精讲问答");
System.out.println(course);
}
}

2.2 版本2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

@Data
public class Course {

private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;

//question & answer
private String courseQA;

public Course(CourseBuilder courseBuilder) {
this.courseName = courseBuilder.courseName;
this.coursePPT = courseBuilder.coursePPT;
this.courseVideo = courseBuilder.courseVideo;
this.courseArticle = courseBuilder.courseArticle;
this.courseQA = courseBuilder.courseQA;
}

public static class CourseBuilder{
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;

//question & answer
private String courseQA;

public CourseBuilder buildCourseName(String courseName){
this.courseName = courseName;
return this;
}


public CourseBuilder buildCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
return this;
}

public CourseBuilder buildCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
return this;
}

public CourseBuilder buildCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
return this;
}

public CourseBuilder buildCourseQA(String courseQA) {
this.courseQA = courseQA;
return this;
}

public Course build(){
return new Course(this);
}

}
}
1
2
3
4
5
6
7
8
9
10
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder()
.buildCourseName("Java设计模式精讲")
.buildCoursePPT("Java设计模式精讲PPT")
.buildCourseVideo("Java设计模式精讲视频")
.build();
System.out.println(course);
}
}

3. Java的应用

  1. JDK 中StringBuilder, stringBuffer的append()
  • image-20230926215714433
  1. spring中BeanDefinitionBuilder

    image-20230926221325746

  2. Mybatis 中MybatisSqlSessionFactoryBuilder

    image-20230926221450251


建造者模式
http://example.com/建造者模式/
作者
Panyurou
发布于
2023年9月26日
许可协议