建造者模式详解
建造者模式详解
1.1 建造者模式概述
1.1.1 定义
建造者模式(Builder Pattern)将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。
- 构建与表示分离:构建代表对象创建,表示代表对象行为、方法,也就是将对象的创建与行为分离。
- 创建不同的表示:也就是具备同样的行为,但是由于构建的行为顺序不同或其他原因可以创建出不同的表示。
1.1.2 应用场景
- 相同的方法,不同的执行顺序,产生不同的结果
- 多种不同变量,组装到一个对象,产生的结果不相同
- 不同的调用顺序会产生不同的作用
- 初始化对象过程复杂并且很多参数有默认值
1.2 建造者模式的通用写法
package org.example.builder;
import org.example.prototype.Person;
public interface IBuilder {
Person builder();
}
package org.example.builder;
import org.example.prototype.Person;
public class ConcreateBuilder implements IBuilder{
private Person person =new Person();
@Override
public Person builder() {
return person;
}
}
建造者模式主要包含4个角色:
- 需要创建的对象
- 抽象建造者
- 具体建造者
- 调用者
2.1建造者模式结局实际问题
2.2.1建造者模式的链式写法
package org.example.builder;
import lombok.Data;
@Data
public class Car {
// 发动机
private String engine;
private String wheel;
private String skeleton;
}
package org.example.builder;
public class CarBuilder {
private Car car = new Car();
public CarBuilder buildWheel(String wheel) {
car.setWheel(wheel);
return this;
}
public CarBuilder buildEngine(String engine) {
car.setEngine(engine);
return this;
}
public CarBuilder buildSkeleton(String skeleton) {
car.setSkeleton(skeleton);
return this;
}
public Car buildCar() {
return car;
}
}
package org.example.builder;
public class BuilderTest {
public static void main(String[] args) {
Car car = new CarBuilder().buildWheel("米其林静音胎")
.buildEngine("2.0T")
.buildSkeleton("铝合金")
.buildCar();
}
}
这种链式的写法是比较常用的,我们经常会在使用JDK的类或者框架源码中看到。
再介绍另一种写法,静态内部类方式对builder进行封装:
package org.example.builder;
import lombok.Data;
@Data
public class Car {
// 发动机
private String engine;
private String wheel;
private String skeleton;
public static class Builder{
private Car car = new Car();
public Builder buildWheel(String wheel) {
car.setWheel(wheel);
return this;
}
public Builder buildEngine(String engine) {
car.setEngine(engine);
return this;
}
public Builder buildSkeleton(String skeleton) {
car.setSkeleton(skeleton);
return this;
}
public Car buildCar() {
return car;
}
}
}
这样的写法使产品和创建之间的联系更紧密,结构更紧凑,便于维护。
3.1 建造者模式在框架源码中的应用
3.1.1 在JDK源码中的应用
- StringBuilder
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
.....
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
可以看到append方法是标准的链式写法。
3.1.2 建造者模式在Spring源码中的应用
- BeanDefinitionBuilder
4.1 建造者模式扩展
4.1.1 建造者模式与工厂模式的区别
- 建造者模式更注重方法的调用顺序,组装的方式会影响创建出来的对象的不同,而工厂模式创建出来的对象都一样。
- 关注点不一样,建造者模式需要知道对象是由哪些部件组成,工厂模式不需要知道细节。
4.1.2 优缺点
优点:
- 封装性好,构建和表示分离
- 扩展性好,建造类之间独立,在一定程度上解耦
- 将复杂对象拆分,便于控制细节
缺点 - 代码复杂度增加
- 如果产品内部发生变化,建造者需同步修改,增加了一定的维护成本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!