1 定义
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
2 类图
产品类(Product):表示被创建的复杂对象。它通常包含多个部分或者组成,并由具体的建造者逐步构建而成。
抽象建造者类(Builder):定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。
具体建造者类(ConcreteBuilder):实现Builder接口,并提供各个部分或者组成的构建方法。
调用者(Director):负责控制建造者的构建顺序,指挥建造者如何构建复杂对象。
3 应用场景
生活中场景
去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
java应用场景
- StringBuilder(append()开放构造步骤,最后toString()构造)
- Lombok的@Builder注解
使用场景
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
4 代码案例
基本写法
首先创建一个产品类Course
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 + '\'' +
'}';
}
}
创建一个建造者类CourseBuilder
public class CourseBuilder{
private Course course = new Course();
public void addName(String name) {
course.setName(name);
}
public void addPPT(String ppt) {
course.setPpt(ppt);
}
public void addVideo(String video) {
course.setVideo(video);
}
public void addNote(String note) {
course.setNote(note);
}
public void addHomework(String homework) {
course.setHomework(homework);
}
public Course build() {
return course;
}
}
调用
public class Test {
public static void main(String[] args) {
CourseBuilder builder = new CourseBuilder();
builder.addName("设计模式");
builder.addPPT("【PPT课件】");
builder.addVideo("【回放视频】");
builder.addNote("【课堂笔记】");
builder.addHomework("【课后作业】");
System.out.println(builder.build());
}
}
责任链写法
修改 建造者类CourseBuilder:
- 将产品类Course变为建造者类的内部类。
- 将构造部分添加进去,都返回CourseBuilder(this)对象
代码如下:
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 + '\'' +
'}';
}
}
}
5 与工厂模式区别
- 建造者模式注重new的过程,工厂模式注重new的结果
- 创建对象力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
6 优缺点
优点
- 封装好,创建和使用隔离
- 扩展性好,建造类之间独立,一定程度上解耦
缺点
- 产生多余的Builder对象
如简单的可直接在Product构造,而建造者模式需要多创建一个Builder对象
- Product内部发生变化,建造者都要修改
比如原本年龄属性是整数类型,现在改为了字符串类型表示,那么在建造者类中的设置年龄的方法就需要相应修改
v 搜【谷丘Coder】发送【建造者模式】获取笔记资料与思维导图