工厂模式

使用工厂模式,我们可以使用工厂函数来创建新对象。

当一个函数在不使用 new 关键字的情况下返回一个新对象时,它就是一个工厂函数!


用户案例

假设我们的应用程序需要很多用户。

我们可以使用 firstName、lastName 和 email 属性创建新用户。

工厂函数还向新创建的对象添加了 fullName 属性,该属性返回 firstName 和 lastName。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

const createUser = ({ firstName, lastName, email }) => ({
  firstName,
  lastName,
  email,
  fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
});

const user1 = createUser({
  firstName: "John",
  lastName: "Doe",
  email: "john@doe.com"
});

const user2 = createUser({
  firstName: "Jane",
  lastName: "Doe",
  email: "jane@doe.com"
});

console.log(user1); // {firstName: "John", lastName: "Doe", email: "john@doe.com", fullName: ƒ fullName()}
console.log(user2); // {firstName: "Jane", lastName: "Doe", email: "jane@doe.com", fullName: ƒ fullName()}

Perfect! 通过调用 createUser 函数轻松创建多个用户。

如果要创建相对复杂和可配置的对象,工厂模式会很有用。

键和值的值可能依赖于特定环境或配置。

使用工厂模式,可以轻松创建包含自定义键和值的新对象!

const createObjectFromArray = ([key, value]) => ({
  [key]: value
});

createObjectFromArray(["name", "John"]); // { name: "John" }

优点

当我们必须创建多个共享相同属性的较小对象时,工厂模式很有用。

工厂函数可以根据当前环境或用户特定的配置轻松返回自定义对象。

大多数情况下,这就是您所需要的,但因为这是 JavaScript,所以还有另一种方法让它感觉更像 Java:class关键字。

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: "john@doe.com"
});

const user2 = new User({
  firstName: "Jane",
  lastName: "Doe",
  email: "jane@doe.com"
});

在 JavaScript 中,类比工厂更加冗长和限制,并且在重构方面有点雷区,但它们也被 React 和 Angular 等主要前端框架所接受,并且有一些罕见的用途- 使复杂性值得的案例。

“有时,优雅的实现只是一个功能。不是方法。不是一个类。不是框架。只是一个功能。” ~ 约翰 卡马克

从最简单的实现开始,仅在需要时转向更复杂的实现。


缺点

但是,在许多情况下,每次创建新实例而不是新对象可能会更消耗内存。


知识点

  • 对象字面量 {}

  • 当一个函数在不使用 new 关键字的情况下返回一个新对象时,它就是一个工厂函数!

此页面上有什么