建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道。属于创建型,也属于GOF23种设计模式。
适用范围
- 1.如果一个对象有非常复杂的内部结构(很多属性)。
- 2.想把复杂对象的创建和使用分离。
优缺点
优点:封装性好,创建和使用分离。扩展性好、建造类之间独立、一定程度上解耦。
缺点:产生多余的Builder对象。产品内部发生变化,建造者都要修改,成本较大。
示例
Course.java
课程类,其中有个静态内部类 CourseBuilder
,用于创建课程。
package com.zaiae.design.pattern.creational.builder;
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
public Course() {
}
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 String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCoursePPT() {
return coursePPT;
}
public void setCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
}
public String getCourseVideo() {
return courseVideo;
}
public void setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
}
public String getCourseArticle() {
return courseArticle;
}
public void setCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
}
public String getCourseQA() {
return courseQA;
}
public void setCourseQA(String courseQA) {
this.courseQA = courseQA;
}
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
", coursePPT='" + coursePPT + '\'' +
", courseVideo='" + courseVideo + '\'' +
", courseArticle='" + courseArticle + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
public static class CourseBuilder {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
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);
}
}
}
Test.java
客户端(应用层)调用建造者,创建所需对象。
package com.zaiae.design.pattern.creational.builder;
public class Test {
public static void main(String[] args) {
Course course = new Course
.CourseBuilder()
.buildCourseName("Java设计模式精讲")
.buildCoursePPT("Java设计模式精讲PPT")
.buildCourseArticle("Java设计模式精讲文章")
.buildCourseVideo("Java设计模式精讲视频")
.buildCourseQA("Java设计模式精讲问答")
.build();
System.out.println(course);
}
}
UML结构图: