本文简单介绍建造者模式,以及介绍lombok@Builder实现原理。
建造者模式(Builder)及其应用
建造者模式
概述
- 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道
类型:创建型设计模式
适用场景:
- 如果一个对象有非常复杂的内部结构(很多属性)
- 想把复杂对象的创建和使用分离
四种角色
- Product (产品角色):一个具体的产品对象。
- Builder (抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。
- ConcreteBuilder (具体建造者):实现接口,构建和装配各个部件。
- Director (指挥者):构建一一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是隔离了客户与对象的生产过程,二是负责控制产品对象的生产过程。
UML类图
Coding
学生类
public class Student {
private String name;
private char sex;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
}
建造者接口(抽象建造者)
public interface IStudentBuilder {
IStudentBuilder builderName(String name);
IStudentBuilder builderAge(Integer age);
IStudentBuilder builderSex(char sex);
Student bulid();
}
建造者
public class StudentBuilder implements IStudentBuilder {
private Student student = new Student();
@Override
public IStudentBuilder builderName(String name) {
student.setName(name);
return this;
}
@Override
public IStudentBuilder builderAge(Integer age) {
student.setAge(age);
return this;
}
@Override
public IStudentBuilder builderSex(char sex) {
student.setSex(sex);
return this;
}
@Override
public Student bulid() {
return student;
}
}
指挥者
public class Director {
private IStudentBuilder iStudentBuilder;
public void setCourseBuilder(IStudentBuilder iStudentBuilder) {
this.iStudentBuilder = iStudentBuilder;
}
public Student makeStudent(String name,Integer age,
char sex ){
this.iStudentBuilder.builderAge(age);
this.iStudentBuilder.builderSex(sex);
this.iStudentBuilder.builderName(name);
return this.iStudentBuilder.bulid();
}
}
客户端(应用层)
public static void main(String[] args) {
Director director = new Director();
director.setCourseBuilder(new StudentBuilder());
Student student = director.makeStudent("张三", 18, '女');
System.out.println(student);
}
- uml
优点:
- 封装性好,创建和使用分离
- 扩展性好、建造者之间独立、一定程度上解耦
缺点:
- 产生多余的Builder对象
- 产品内部发生变化,建造者都要修改,成本较大
升级:链式处理
- coding
public class Student {
private String name;
private char sex;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
public static class Builder {
private Student student = new Student();
public Builder builderName(String name) {
student.setName(name);
return this;
}
public Builder builderAge(Integer age) {
student.setAge(age);
return this;
}
public Builder builderSex(char sex) {
student.setSex(sex);
return this;
}
public Student bulid() {
return student;
}
}
}
测试类
public static void main(String[] args) {
Student bulid = new Student.Builder().builderAge(10).builderName("李四").builderSex('男').bulid();
System.out.println(bulid);
}
框架中的建造者模式
后续补
拓展知识:Lombok
@Builder就可以实现建造者链式处理。