创建模式
建造者模式
定义
将一个复杂对象的构建与它的表示进行分离,使得同样的构建过程可以创建不同的表示
特征
用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道
类型
创建型
适用场景
如果一个对象有非常复杂的内部结构(很多属性)
想把复杂对象的创建和使用分离
优点
封装性好,创建和使用分离
扩展性好、建造类之间独立、一定程度上解耦
缺点
产生多余的builder对象
产品内部发生变化,建造者都要修改,成本较大
和工厂模式的区别
建造者模式更注重方法的调用顺序,而工厂模式注重于创建产品
创建对象的粒度不同:建造者模式可以创建一些复杂的产品,由各种复杂的部件组成,工厂模式创建出来的都是一个样子
关注点不同:工厂模式只要把产品创建出来就ok了,而建造者模式不仅要创建出这个产品,我还要知道这个产品都是由哪些部件组成的
建造者模式在某些业务场景,比如说一定的顺序决定了产出的产品不一样的话,那么这里也要把顺序进行调整,工厂则不关心顺序。
实例
假设我们要创建一个课程
课程实体类
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
//question&answer
private String courseQA;
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public void setCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
}
public void setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
}
public void setCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
}
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 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();
}
实际的建造者
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;
}
}
产品经理来建造这个课程
public class Coach {
CourseBuilder courseBuilder;
public void setCourseBuilder(CourseBuilder courseBuilder) {
this.courseBuilder = courseBuilder;
}
public Course makeCourse(String courseName,String coursePPT,String courseVideo,String courseArticle,String courseQA) {
courseBuilder.buildCourseName(courseName);
courseBuilder.buildCoursePPT(coursePPT);
courseBuilder.buildCourseVideo(courseVideo);
courseBuilder.buildCourseArticle(courseArticle);
courseBuilder.buildCourseQA(courseQA);
return courseBuilder.makeCourse();
}
}
Test 测试类
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设计模式", "PPT"
, "视频", "手记", "问答");
System.out.println(course);
}
}
输出:
Course{courseName='java设计模式', coursePPT='PPT', courseVideo='视频', courseArticle='手记', courseQA='问答'}
uml

通过静态内部类链式调用来进行改进
course
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;
}
@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;
//question&answer
private String courseQA;
public CourseBuilder setCourseName(String courseName) {
this.courseName = courseName;
return this;
}
public CourseBuilder setCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
return this;
}
public CourseBuilder setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
return this;
}
public CourseBuilder setCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
return this;
}
public CourseBuilder setCourseQA(String courseQA) {
this.courseQA = courseQA;
return this;
}
public Course build(){
return new Course(this);
}
}
}
Test类
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().setCourseName("java设计模式").
setCoursePPT("PPT").setCourseArticle("手记").setCourseQA("问答").setCourseVideo("视频").build();
System.out.println(course);
}
}
输出:
Course{courseName='java设计模式', coursePPT='PPT', courseVideo='视频', courseArticle='手记', courseQA='问答'}
浙公网安备 33010602011771号