- 定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。对于用户而言,只需要指定建造的类型即可,不需要关注建造的细节。
思想:因为建造者需要了解产品的组成部分,所以一个建造者往往只能创建一种类型的产品。建造者不仅要建造出产品对象,还要关注建造过程中方法的调用顺序。
-
通用类图
具体实现
public class CourseBuilder {
private Course course = new Course();
public CourseBuilder addName(String name) {
course.setName(name);
return this;
}
public CourseBuilder addPPT(String ppt) {
course.setPpt(ppt);
return this;
}
public CourseBuilder addVideo(String video) {
course.setVideo(video);
return this;
}
public CourseBuilder addNote(String note) {
course.setNote(note);
return this;
}
public CourseBuilder addHomework(String homework) {
course.setHomework(homework);
return this;
}
public Course build() {
return this.course;
}
@Data
public class Course {
private String name;
private String ppt;
private String video;
private String note;
private String homework;
@Override
public String toString() {
return "CourseBuilder{" +
"name='" + name + '\'' +
", ppt='" + ppt + '\'' +
", video='" + video + '\'' +
", note='" + note + '\'' +
", homework='" + homework + '\'' +
'}';
}
}
}
public class Course {
private String name;
private String ppt;
private String video;
private String note;
private String homework;
@Override
public String toString() {
return "CourseBuilder{" +
"name='" + name + '\'' +
", ppt='" + ppt + '\'' +
", video='" + video + '\'' +
", note='" + note + '\'' +
", homework='" + homework + '\'' +
'}';
}
}
public class Test {
public static void main(String[] args) {
CourseBuilder builder = new CourseBuilder()
.addName("设计模式")
.addPPT("【PPT课件】")
.addVideo("【回放视频】")
.addNote("【课堂笔记】")
.addHomework("【课后作业】");
System.out.println(builder.build());
}
}
- 应用场景
建造者模式适用于一个具有多个部分组成的对象的创建。适用于:
- 相同的方法,调用的顺序不同,产生的结果不同。
- 多个部件都装配到一个对象中,产生的结果又不相同。
- 产品类非常复杂,或者产品类中的调用顺序不同,产生的结果不同。
- 初始化一个对象特别复杂,而且这些参数都有默认值。
- 优缺点
优点
- 封装性好,创建和使用分离。
- 扩展性好,建造类之间独立,一定程度上实现解耦。
缺点 - 产生多余的builder。
- 当产品内部发生变化的时候,建造者也要做相应的修改,改动量大。
- 建造者模式和工厂模式的对比
- 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。
- 构建对象的力度不同。建造者模式创建复杂的对象,由各种复杂的部件组成。工厂模式创建出来的都一样。
- 关注点不一样。建造者模式需要知道对象由哪些部件组成,而工厂模式只需要创建出对象。
- 建造者模式根据建造过程中的顺序不同,最终对象部件组成也不一样。