文章目录
1. 建造者模式
1.1 概述
定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
特征:
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
类型: 创建型
适用场景:
- 如果一个对象有非常复杂的内部结构(很多属性)
- 想把复杂对象的创建和使用分离
优点:
- 封装性好,创建和使用分离
- 扩展性好、建造类之间独立、一定程度上解耦
缺点:
- 产生多余的Builder对象
- 产品内部发生变化,建造者都要修改,成本较大
注意:
建造者模式和工厂模式比较相近,而建造者模式更注重方法的调用顺序,工厂模式注重创建场景;创建对象的力度不同,建造者模式可以创建一些复杂的产品,并且要知道由哪些复杂的部件组成(还有顺序、步骤),工厂模式只要创建起来就ok了,不管那么多。
1.2 代码理解
模拟的需求北京
视频教学网站有很多课程,一门课程包含手记、PPT、视频等内容。讲师负责课程这些内容的制作,视频教学网站的工作人员(就叫课程教练)与教师对接。 视频教学网站的老板,要发布一门课程会直接和课程教练沟通,课程教练与对应的讲师对接,然后共同制作课程。(课程教练相当于指挥官,根据讲师提供的视频、ppt等资料,拼装成一门课)
课程制作–课程建造器
课程实体类Course:
package com.gangbb.creational.builder;
/**
* @author Gangbb
* @date 2021/4/16 21:10
* @Description: 课程实体类
*/
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
//question & answer
private String 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 + '\'' +
'}';
}
}
课程抽象建造者CourseBuilder
package com.gangbb.creational.builder;
/**
* @author Gangbb
* @date 2021/4/16 21:11
* @Description: 课程抽象建造者
*/
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();
}
课程实际建造者类CourseActualBuilder
package com.gangbb.creational.builder;
/**
* @author Gangbb
* @date 2021/4/16 21:13
* @Description: 课程实际建造者类
*/
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;
}
}
课程教练类Coach
package com.gangbb.creational.builder;
/**
* @author Gangbb
* @date 2021/4/16 21:33
* @Description: 课程教练类
*/
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();
}
}
此时UML类图:

测试使用类Test
package com.gangbb.creational.builder;
/**
* @author Gangbb
* @date 2021/4/16 21:38
* @Description:
*/
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);
}
}
此时Test相当于老板,可以创建 课程教练并告诉它以用什么实际的CourseBuilder来创建课程,示例中的CourseActualBuilder可以衍生为更多的前端课程、python课程等!
V2版本:用静态内部类构造器
Course
package com.gangbb.creational.builder.v2;
/**
* @author Gangbb
* @date 2021/4/16 22:01
* @Description:
*/
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 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
package com.gangbb.creational.builder.v2;
import com.google.common.collect.ImmutableSet;
import java.util.Set;
/**
* @author Gangbb
* @date 2021/4/16 22:23
* @Description:
*/
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);
Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();
System.out.println(set);
}
}
1.3 开源框架源码使用分析
1.3.1 JDK中的Builder
package java.lang.StringBuilder
1.3.2 ImmutableSet
使用
Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();
1.3.3 spring中的BeanDefinitionBuilder
package org.springframework.beans.factory.support.BeanDefinitionBuilder
1.3.4 mybatis中的SqlSessionFactoryBuilder
package org.apache.ibatis.session.SqlSessionFactoryBuilder
1.4 趣味理解
MM 最爱听的就是「我爱你」这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的键,它就能够用相应的语言说出「我爱你」这句话了,国外的 MM 也可以轻松搞掂,这就是我的「我爱你」builder。建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程
845

被折叠的 条评论
为什么被折叠?



