是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过 程可以创建不同的表示,属于创建型模式。使用建造者模式对于用户而言只需指定需要建造的类型就可 以获得对象,建造过程及细节不需要了解。
优点
- 封装性好,创建和使用分离
- 扩展性好,建造类之间独立、一定程度上解耦
缺点
- 产生多余的 Builder 对象;
- 产品内部发生变化,建造者都要修改,成本较大
适用场景
建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产 品的各个零件经常猛烈变化,但是它们的组合方式却相对稳定。
- 相同的方法,不同的执行顺序,产生不同的结果时
- 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
- 当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。
场景的业务场景
例如 Query, 在sql条件无规律的情况下, 用户不在需要关心数据库具体需要的sql拼接规则, 而是通过链路调用的方式添加属性的查询逻辑, 是eq 还是 or 或是like, order by 等; 不再需要关心sql中某个关键字的位置, 可以避免手动拼接sql时产生的人为拼接错误;
例如: StringBuilder中, 我们拼接字符串的时候想要字符串拼接到一块, 那么java语言的特性, 因为String类是不可变, 一定会产生多个String对象; 那么用到Stringbuilder的时候, 它会将用户需要拼接的内容存储在char[]数组中, 等用户是什么时候拼接结束的时候调用 toString方法就可以将数组中的内容按原有添加顺序, 一次性进行转化成String
Demo 组装电脑,一台电脑有鼠标,键盘,主机,显示器,音响。。我们可以选择自己需要的
public class Computer {
private String zhuji;
private String shubiao;
private String xianshiqi;
private String yinxiang;
private String jianpan;
public void setShubiao(String shubiao) {
this.shubiao = shubiao;
}
public void setJianpan(String jianpan) {
this.jianpan = jianpan;
}
public void setXianshiqi(String xianshiqi) {
this.xianshiqi = xianshiqi;
}
public void setYinxiang(String yinxiang) {
this.yinxiang = yinxiang;
}
public void setZhuji(String zhuji) {
this.zhuji = zhuji;
}
@Override
public String toString() {
return "Computer{" +
"zhuji='" + zhuji + '\'' +
", shubiao='" + shubiao + '\'' +
", xianshiqi='" + xianshiqi + '\'' +
", yinxiang='" + yinxiang + '\'' +
", jianpan='" + jianpan + '\'' +
'}';
}
}
public class ComputerBuilder {
private Computer computer = new Computer();
public ComputerBuilder needShubiao() {
computer.setShubiao("鼠标");
return this;
}
public ComputerBuilder needJianpan() {
computer.setJianpan("键盘");
return this;
}
public ComputerBuilder needYinxiang() {
computer.setXianshiqi("音响");
return this;
}
public ComputerBuilder needXianshiqi() {
computer.setXianshiqi("显示器");
return this;
}
public ComputerBuilder needZhuji() {
computer.setZhuji("主机");
return this;
}
public Computer build() {
return this.computer;
}
}
// 客户端
public class MainTest {
public static void main(String[] args) {
ComputerBuilder computerBuilder = new ComputerBuilder();
Computer computer = computerBuilder.needZhuji().needJianpan().needZhuji().needShubiao().needXianshiqi().build();
System.out.println(computer);
}
}
JDK中的运用
StringBuilder类

建造者模式和工厂模式的区别
- 建造者模式更加注重方法的调用顺序,工厂模式注重于创建对象
- 创建对象的粒度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来 的都一样
- 关注重点不一样,工厂模式模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出 这个对象,还要知道这个对象由哪些部件组成。
- 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样