设计模式
工厂模式
使用工厂模式,我们可以使用 **工厂函数** 来创建新的对象。当一个函数返回一个新的对象,而没有使用 new
关键字时,这个函数就是一个工厂函数!
假设我们需要为我们的应用程序创建许多用户。我们可以使用 firstName
、lastName
和 email
属性来创建新的用户。工厂函数还会为新创建的对象添加 fullName
属性,该属性返回 firstName
和 lastName
。
const createUser = ({ firstName, lastName, email }) => ({
firstName,
lastName,
email,
fullName() {
return `${this.firstName} ${this.lastName}`;
},
});
完美!现在我们可以通过调用 createUser
函数轻松创建多个用户。
index.js
1const createUser = ({ firstName, lastName, email }) => ({2 firstName,3 lastName,4 email,5 fullName() {6 return `${this.firstName} ${this.lastName}`;7 }8});910const user1 = createUser({11 firstName: "John",12 lastName: "Doe",14});1516const user2 = createUser({17 firstName: "Jane",18 lastName: "Doe",20});2122console.log(user1);23console.log(user2);
如果我们要创建相对复杂且可配置的对象,工厂模式就非常有用。键值对的值可能依赖于特定的环境或配置。使用工厂模式,我们可以轻松创建包含自定义键值对的新对象!
const createObjectFromArray = ([key, value]) => ({
[key]: value,
});
createObjectFromArray(["name", "John"]); // { name: "John" }
优点
当我们需要创建多个具有相同属性的较小对象时,工厂模式非常有用。工厂函数可以轻松返回一个自定义对象,具体取决于当前环境或用户特定的配置。
缺点
在 JavaScript 中,工厂模式不过是一个返回对象的函数,它不使用 new
关键字。 ES6 箭头函数 允许我们创建每次隐式返回对象的较小的工厂函数。
但是,在许多情况下,每次创建新实例而不是新对象可能更节省内存。
class User {
constructor(firstName, lastName, email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
const user1 = new User({
firstName: "John",
lastName: "Doe",
email: "[email protected]",
});
const user2 = new User({
firstName: "Jane",
lastName: "Doe",
email: "[email protected]",
});
参考资料
- 使用 ES6+ 的 JavaScript 工厂函数 - Eric Elliott