定义
- 建造者模式是将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
- 用户只需要指定需要建造的类型就可以创建他们,创建过程及细节不需要知道。
- 类型: 创建型
适用场景
- 如果一个对象有非常复杂的内部结构(属性多)
- 把复杂的对象的创建和使用分离
优点
- 封装性好 创建和使用分离
- 拓展性好,建造类之间独立,一定程度上解耦
缺点
- 产生多余的builder对象
- 产品内部发生变化,建造者需要进行修改
建造者模式与工厂模式的区别
- 建造者模式更注重于方法的调用顺序,工厂模式更注重于创建产品
- 创建对象的力度不同,工厂模式创建复杂产品可以由各种部件组成,工厂模式创建出来的产品相同。
- 工厂模式只需要创建出来,创建者模式需要知道该产品都有哪些部件。
- 创建一个对象需要很多步骤时适用于建造者模式,只需要简单创建则工厂模式就可以。
Conding
Lombok插件中的@Builder注解提供的构建对象的方式就是典型的建造者模式。
package com.example.design.creational.course.v2;
import lombok.Data;
import lombok.ToString;
/**
* 建造者模式 静态内部类
*
* @author wang
*/
@Data
@ToString
public class Course {
private String courseName;
private String coursePpt;
private String courseVideo;
private String courseArticle;
private String courseQa;
public Course(CourseBuilder courseBuilder) {
this.courseName = courseBuilder.courseName;
this.courseArticle = courseBuilder.courseArticle;
this.coursePpt = courseBuilder.coursePpt;
this.courseQa = courseBuilder.courseQa;
this.courseVideo = courseBuilder.courseVideo;
}
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);
}
}
}
使用时可以直接使用builder方式进行创建对象
package com.example.design.creational.course.v2;
/**
* @author wang
*/
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().
buildCourseArticle("article").
buildCourseName("name").
buildCoursePpt("ppt").
buildCourseQa("qa").
buildCourseVideo("video")
.build();
System.out.println(course);
}
}