Skip to content
On this page

工厂模式

通过构造器创建多个对象

javascript
let mondo = {
  name: 'mondo',
  age: 30,
  work: '程序员'
}

// 构造器
function User(name, age, work) {
  this.name = name;
  this.age = age;
  this.work = work;
}

let imondo = new User('imondo', 31, '主播');

但是当我们需要在每个对象中加入工作描述时,是不是都需要写多个构造器呢?

javascript
function CoderUser(name, age) {
  this.name = name;
  this.age = age;
  this.work = 'coder';
  this.workContent = ['写BUG']
}

function UIUser(name, age) {
  this.name = name;
  this.age = age;
  this.work = 'UI';
  this.workContent = ['设计']
}

function Factory(name, age, work) {
  switch (work) {
    case 'coder':
      return new CoderUser(name, age)
      break;
    case 'UI':
      return new UIUser(name, age)
      break;
      ...
  }
}

可以看到,如果每个工种都去写一个构造器,对于我们是有多大麻烦;这时需要抽象出员工的变与不变

:每个员工的工作内容可能是不同的 不变: 每个员工对应的 name,age,work,workContent 四个属性是不变的

经过抽象我们可以完全抽离出 User 构造器

javascript
function User(name, age, work, workContent) {
  this.name = name;
  this.age = age;
  this.work = work;
  this.workContent = workContent
}

而变化的只有工作内容

javascript
function Factory(name, age, work) {
  let workContent = '';
  switch (work) {
    case 'coder':
      workContent = ['写BUG']
      break;
    case 'UI':
      workContent = ['设计']
      break;
  }
  return new User(name, age, work, workContent);
}

这样我们就不用每个工种都去创建构造器,而只用无脑传参就可以。

Factory 就是工厂模式:就是将构造对象的过程封装起来

就像我们去餐馆点菜:比如说点一份西红柿炒蛋,我们不用关心西红柿怎么切、怎么打鸡蛋这些菜品制作过程中的问题,我们只关心摆上桌那道菜。在工厂模式里,我传参这个过程就是点菜,工厂函数里面运转的逻辑就相当于炒菜的厨师和上桌的服务员做掉的那部分工作——这部分工作我们同样不用关心,我们只要能拿到工厂交付给我们的实例结果就行了。