es6 语法学习 - 建造者模式
一、基本概念
建造者模式(Builder Pattern)是一种创建型设计模式,它主要用于构建一个复杂对象。该模式将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
二、 优点
- 代码清晰:可以通过一步一步的设置参数,来创建复杂对象,使代码更易读。
- 可扩展性:可以灵活地增加或修改构建复杂对象的方式,而不影响使用者代码。
- 易于维护:便于维护和改进,尤其是在复杂对象有多个可选参数时。
三、缺点
- 类的数量增加:每个具体建造者对应一个类,可能导致类的数量增加。
- 实现复杂:对复杂对象的建造过程,代码实现相对复杂。
四、使用场景
- 需要生成的对象具有复杂的内部结构,且内部属性相互依赖。
- 需要构建的对象类型较多,但构建过程相似,可以通过不同的具体建造者类来构建不同的对象。
- 对象的构建过程需要多个步骤,且这些步骤的顺序可能不同。
五、示例代码
假设我们要构建一个表示“用户信息”(UserInfo)的复杂对象,这个对象包含多个部分,如姓名、地址、联系方式等。我们可以使用建造者模式来逐步构建这个对象。
首先,我们定义一个UserInfo
类,它表示最终要构建的对象:
// UserInfo.js
class UserInfo {
constructor(name, address, contact) {
this.name = name;
this.address = address;
this.contact = contact;
}
// 可以添加一个方法来展示用户信息
showInfo() {
console.log(`Name: ${this.name}`);
console.log(
`Address: ${this.address.street}, ${this.address.city}, ${this.address.country}`
);
console.log(`Contact: ${this.contact.email}, ${this.contact.phone}`);
}
}
接下来,我们定义一个Builder
类,它包含构建UserInfo
对象所需的所有步骤:
// UserInfoBuilder.js
class UserInfoBuilder {
constructor() {
this.userInfo = new UserInfo(
'',
{ street: '', city: '', country: '' },
{ email: '', phone: '' }
);
}
setName(name) {
this.userInfo.name = name;
return this; // 返回当前Builder实例,以便链式调用
}
setAddress(street, city, country) {
this.userInfo.address = { street, city, country };
return this;
}
setContact(email, phone) {
this.userInfo.contact = { email, phone };
return this;
}
build() {
// 返回最终构建的UserInfo对象
return this.userInfo;
}
}
最后,我们可以编写一个客户端代码来使用这个建造者模式:
// client.js
const builder = new UserInfoBuilder();
const userInfo = builder
.setName('simahenet')
.setAddress('八卦岭', '深圳', '中国')
.setContact('sina@163.com', '13988888888')
.build();
userInfo.showInfo();
在这个例子中,UserInfo
类表示了要构建的对象,UserInfoBuilder
类包含了构建这个对象所需的所有步骤,并且每个步骤都返回Builder
实例本身,以便进行链式调用。客户端代码通过创建Builder
实例并逐步调用其方法来构建UserInfo
对象,最后调用build
方法来获取最终的对象。
这种方式使得构建复杂对象的过程变得更加灵活和可配置,因为你可以根据需要添加、删除或重新排列构建步骤。同时,它也使得代码更加清晰和易于维护,因为每个构建步骤都封装在Builder
类中。