📜  工厂函数 (1)

📅  最后修改于: 2023-12-03 15:09:41.385000             🧑  作者: Mango

工厂函数

工厂函数是一种创建对象的设计模式,常见于JavaScript中。它是一种函数,返回一个新的对象实例,并且可以根据传递给函数的参数或其他条件返回不同的实例。

优点
  1. 可以减少重复代码。如果你需要创建多个相似的对象,使用工厂函数可以减少重复的代码。
  2. 更好的封装。通过工厂函数,你可以控制创建对象的细节,包括属性和方法的初始化。
  3. 简化代码。工厂函数可以把创建对象的代码放在一个顶级函数里面,使代码更加简洁易懂。
代码示例

下面是一个简单的工厂函数示例:

function createPerson(name, age) {
  return {
    name: name,
    age: age,
    sayHello: function() {
      console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    }
  };
}

const person1 = createPerson('John', 30);
const person2 = createPerson('Jane', 25);

person1.sayHello(); // 输出 "Hello, my name is John and I am 30 years old."
person2.sayHello(); // 输出 "Hello, my name is Jane and I am 25 years old."

在上面的示例中,createPerson 是一个工厂函数,它接受两个参数 nameage,并返回一个包含这些属性以及 sayHello 方法的对象。

继承性工厂函数

可以将工厂函数的优点与继承的概念结合起来,创建一个可以方便地生成不同类型的对象的工厂函数。这通常被称为“继承性工厂函数”。

例如,下面的示例是一个继承性工厂函数,它可以根据传入的 type 参数返回不同类型的对象:

function createShape(options) {
  switch (options.type) {
    case 'circle':
      return {
        type: 'circle',
        radius: options.radius,
        area: function() {
          return Math.PI * this.radius * this.radius;
        }
      };
    case 'rectangle':
      return {
        type: 'rectangle',
        width: options.width,
        height: options.height,
        area: function() {
          return this.width * this.height;
        }
      };
    default:
      throw new Error('Invalid shape type');
  }
}

const circle = createShape({ type: 'circle', radius: 5 });
console.log(circle.area()); // 输出 78.53981633974483

const rectangle = createShape({ type: 'rectangle', width: 10, height: 20 });
console.log(rectangle.area()); // 输出 200

上面的示例中,createShape 是一个继承性工厂函数,它根据传入的 type 参数返回不同类型的对象。每个对象都有一个 type 属性和一个 area 方法。

总结

工厂函数是一种创建对象的设计模式,它可以减少重复代码,更好地封装细节,并简化代码。同样,它也可以和继承的概念结合起来,创建一个方便的、具有继承性的工厂函数。