目录
一.什么是建造者模式
建造者模式的优点:
- 封装性好,创建和使用分离
- 扩展性好,建造类之间独立、一定程度上解耦
建造者模式的缺点:
- 产生多余的Builder对象
- 产品内部发生变化,建造者都要修改,成本较大
建造者模式的适用场景:
- 适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。
- 如果一个对象有非常复杂的内部结构(很多属性)
- 把复杂对象的创建和使用分离
二.代码演示
用建造者的模式给一个学生类赋值
Student类:
@Data
public class Student {
private String name;
private Integer age;
private Long no;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", no='" + no + '\'' +
'}';
}
}
建造者类:StudentBuilder
public class StudentBuilder {
//要构建的对象
private Student student;
public StudentBuilder(Student student) {
this.student = student;
}
public void addName(String name) {
student.setName(name);
}
public void addAge(Integer age) {
student.setAge(age);
}
public void addNo(Long no) {
student.setNo(no);
}
//调用build方法 返回建造的对象
public Student build() {
return student;
}
}
Test:
public class Test1 {
public static void main(String[] args) {
Student student = new Student();
StudentBuilder studentBuilder = new StudentBuilder(student);
studentBuilder.addName("ws");
studentBuilder.addAge(18);
studentBuilder.addNo(2018024265L);
System.out.println(studentBuilder.build());
}
}
但是这样写代码不是很优雅,我们可以采用链式编程的方法进行改进 StringBuilder的append方法就是链式的
StudentBuilder
public class StudentBuilder {
//要构建的对象
private Student student;
public StudentBuilder(Student student) {
this.student = student;
}
public StudentBuilder addName(String name) {
student.setName(name);
return this;
}
public StudentBuilder addAge(Integer age) {
student.setAge(age);
return this;
}
public StudentBuilder addNo(Long no) {
student.setNo(no);
return this;
}
//调用build方法 返回建造的对象
public Student build() {
return student;
}
}
Test1
public class Test1 {
public static void main(String[] args) {
// Student student = new Student();
// StudentBuilder studentBuilder = new StudentBuilder(student);
// studentBuilder.addName("ws");
// studentBuilder.addAge(18);
// studentBuilder.addNo(2018024265L);
// System.out.println(studentBuilder.build());
Student student = new StudentBuilder(new Student())
.addName("ws")
.addAge(18)
.addNo(2018024265L)
.build();
System.out.println(student);
}
}
三.建造者模式和工厂模式的区别
- 建造者模式更加注重方法的调用顺序(也就是创建对象添加属性的过程),工厂模式注重于创建对象(也就是得到对象这个结果).
- 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的都一样。
- 关注点:工厂模式模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象由哪些部件组成。
- 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样。