对我们的下一本书感兴趣吗?了解更多关于 使用 React 构建大型 JavaScript Web 应用程序

设计模式

工厂模式

使用工厂模式,我们可以使用 **工厂函数** 来创建新的对象。当一个函数返回一个新的对象,而没有使用 new 关键字时,这个函数就是一个工厂函数!

假设我们需要为我们的应用程序创建许多用户。我们可以使用 firstNamelastNameemail 属性来创建新的用户。工厂函数还会为新创建的对象添加 fullName 属性,该属性返回 firstNamelastName

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});
9
10const user1 = createUser({
11 firstName: "John",
12 lastName: "Doe",
13 email: "[email protected]"
14});
15
16const user2 = createUser({
17 firstName: "Jane",
18 lastName: "Doe",
19 email: "[email protected]"
20});
21
22console.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]",
});

参考资料