JAVA设计模式之建造者模式-创建型
文章目录
1. 定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
用户只需要指定建造的类型就可以得到他们,建造过程与细节不需要知道
2. 类型
创建型
3. 适用场景
如果一个对象有非常复杂的内部结果(很多属性)
想把复杂对象的创建和使用分离
4. 优点
封装性好,创建和使用分离
扩展性好、建造类之间独立、一定程度上解耦
5. 缺点
产生多余的builder对象
铲平内部发生变化,建造者都要修改,成本较大
6. 相关设计模式
建造者模式和工厂模式
建造者模式注重方法的调用顺序,而工厂模式注重创建产品,创建力度不同,可以创建复杂的部位组成,而工厂模式创建的都是一样的
7. coding
原型以课程为例,课程 包含 名称 PPT 视频 手记 问答 抽象者建立创建课程名称 PPT 视频 手记 问答 ,实际的创建者创建课程名称 PPT 视频 手记 问答,由讲师来进行创建具体的课程类
7.1 课程类
package com.maidou.learning.design.creatation.builder;
import lombok.Data;
import lombok.ToString;
/**
* @Author maicheng
* @Description : 课程类
* @Date 23:12 2022/10/26
**/
@Data
@ToString
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
}
7.2 创建课程的抽象类
package com.maidou.learning.design.creatation.builder;
/**
* @ClassName CourseBuilder * @Description TODO
* @Author maido
* @Date 23:12 2022/10/26
* @Version 1.0
**/
public abstract class CourseBuilder {
public abstract void setCourseName(String courseName);
public abstract void setCoursePPT(String coursePPT);
public abstract void setCourseVideo(String courseVideo);
public abstract void setCourseArticle(String courseArticle);
public abstract void setCourseQA(String courseQA);
public abstract Course createCourse();
}
7.3 创建课程的继承类
package com.maidou.learning.design.creatation.builder;
/**
* @ClassName CourseActualBuilder * @Description TODO
* @Author maido
* @Date 23:15 2022/10/26
* @Version 1.0
**/
public class CourseActualBuilder extends CourseBuilder{
private Course course = new Course();
@Override
public void setCourseName(String courseName) {
course.setCourseName(courseName);
}
@Override
public void setCoursePPT(String coursePPT) {
course.setCoursePPT(coursePPT);
}
@Override
public void setCourseVideo(String courseVideo) {
course.setCourseVideo(courseVideo);
}
@Override
public void setCourseArticle(String courseArticle) {
course.setCourseArticle(courseArticle);
}
@Override
public void setCourseQA(String courseQA) {
course.setCourseQA(courseQA);
}
@Override
public Course createCourse() {
return course;
}
}
7.4 讲师根据抽象的课程创建具体的课程信息
package com.maidou.learning.design.creatation.builder;
/**
* @ClassName Coach
* @Description 教练
* @Author maido
* @Date 23:21 2022/10/26
* @Version 1.0
**/
public class Coach {
private CourseBuilder courseBuilder;
public Coach(CourseBuilder courseBuilder) {
this.courseBuilder = courseBuilder;
}
public Course createCourse(String courseName, String coursePPT, String courseVideo, String courseArticle,
String courseQA) {
courseBuilder.setCourseName(courseName);
courseBuilder.setCoursePPT(coursePPT);
courseBuilder.setCourseVideo(courseVideo);
courseBuilder.setCourseArticle(courseArticle);
courseBuilder.setCourseQA(courseQA);
return courseBuilder.createCourse();
}
}
7.5 改造 链式调用
package com.maidou.learning.design.creatation.builder.v2;
/**
* @ClassName course
* @Description TODO
* @Author maido
* @Date 0:06 2022/10/27
* @Version 1.0
**/
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
", coursePPT='" + coursePPT + '\'' +
", courseVideo='" + courseVideo + '\'' +
", courseArticle='" + courseArticle + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
public Course(CourseBuilder courseBuilder) {
this.courseName = courseBuilder.courseName;
this.coursePPT = courseBuilder.coursePPT;
this.courseVideo = courseBuilder.courseVideo;
this.courseQA = courseBuilder.courseQA;
this.courseArticle = courseBuilder.courseArticle;
}
public static class CourseBuilder {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
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);
}
}
}
测试
package com.maidou.learning.design.creatation.builder.v2;
/**
* @ClassName MainTest
* @Description TODO
* @Author maido
* @Date 0:17 2022/10/27
* @Version 1.0
**/
public class MainTest {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().setCourseName("springboot测试").build();
System.out.println(course);
}
}
8 源码解析
8.1 StringBuilder StringBuffer
8.1.1 来源
java.lang.StringBuilder
8.1.2 coding 标准的建造者模式
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
8.2 BeanDefinitionBuilder
8.2.1 来源
org.springframework.beans.factory.support.BeanDefinitionBuilder
8.2.2 coding
public static BeanDefinitionBuilder genericBeanDefinition() {
return new BeanDefinitionBuilder(new GenericBeanDefinition());
}
public static BeanDefinitionBuilder genericBeanDefinition(String beanClassName) {
BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
builder.beanDefinition.setBeanClassName(beanClassName);
return builder;
}
public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
builder.beanDefinition.setBeanClass(beanClass);
return builder;
}
public static <T> BeanDefinitionBuilder genericBeanDefinition(Class<T> beanClass, Supplier<T> instanceSupplier) {
BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
builder.beanDefinition.setBeanClass(beanClass);
builder.beanDefinition.setInstanceSupplier(instanceSupplier);
return builder;
}
以上可以看出返回的都是对象本身
8.3 其他
SqlSessionFactoryBuilder XmlConfigBuilder 等等都是建造者模式