2.建造者模式
建造者模式(Builder Pattern)的核心是:把一个复杂对象的 "构造过程" 拆分成多个步骤,让同一个构造过程可以创建出不同的表示(不同配置的对象)
适合使用建造者模式的场景
- 对象有 10 个以上属性,且其中很多是可选的
- 需要创建多种配置组合的对象
- 希望构造过程清晰、步骤明确,并且希望在构造时做较多校验
- 希望对象是不可变的
类型定义
interface RequestConfig {
url: string;
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
headers: Record<string, string>;
timeout: number;
body?: unknown;
}建造者类
class RequestBuilder {
private config: RequestConfig;
constructor(url: string) {
this.config = {
url,
method: 'GET',
headers: {},
timeout: 5000,
};
}
setMethod(method: RequestConfig['method']): RequestBuilder {
this.config.method = method;
return this;
}
addHeader(key: string, value: string): RequestBuilder {
this.config.headers[key] = value;
return this;
}
setTimeout(ms: number): RequestBuilder {
this.config.timeout = ms;
return this;
}
setBody(body: unknown): RequestBuilder {
this.config.body = body;
return this;
}
build(): RequestConfig {
// 验证:GET 请求不应携带 body
if (this.config.method === 'GET' && this.config.body !== undefined) {
throw new Error('GET 请求不应携带 body');
}
// 可以在这里添加更多验证逻辑...
return { ...this.config }; // 返回一个副本,避免外部直接修改内部 config
}
}使用示例
const getRequest = new RequestBuilder("https://api.example.com/users")
.setMethod("GET")
.addHeader("Authorization", "Bearer token123")
.addHeader("Accept", "application/json")
.setTimeout(10000)
.build();
console.log("GET 请求配置:", getRequest);
const postRequest = new RequestBuilder("https://api.example.com/users")
.setMethod("POST")
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer token123")
.setTimeout(8000)
.setBody({
name: "张三",
age: 28,
email: "zhangsan@example.com"
})
.build();
console.log("POST 请求配置:", postRequest);