天天看点

JavaScript 设计模式 - 001工厂模式JavaScript 常用设计模式

JavaScript 常用设计模式

001: 工厂模式

***工厂模式介绍:***

工厂模式(Factory Pattern)是 JavaScript 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

***为什么我们要使用工厂模式呢?***

先来看一个需求: 我们想要将同学们根据文理课来规划同学们所要学习的subject。

先看第一种普通方法:

function Student(name, subjects){
    this.name = name;
    this.subjects = subjects;
 }

 var jhg = new Student('kjh',['政治','历史','地理']);
 console.log(kjh);  
 //Student { name: 'kjh', subjects: [ '政治', '历史', '地理' ] }

 var hjl = new Student('hjl',['化学','生物','物理']);
 console.log(hjl);
 //Student { name: 'hjl', subjects: [ '化学', '生物', '物理']}
           

很容易我们发现了上面的代码的弊端,就是我们在记录一个新的同学的时候,都需要通过new的过程,并且传入对应的name,sunjects,

如果我们学校有1000个人,10000个人呢,这样记录的工作量就很大。

姑且我们称上面的代码为low code 1.0.

接下来我们使用工厂模式来解决这个问题:
/**
 * 创建学生
 * @param {string} name 姓名
 * @param {string} type 文科/理科
 * @return {Student}
 */

function Student(name, subjects) {
  this.name = name;
  this.subjects = subjects;
}

function studentFactory(name, type) {
  switch (type) {
    case '文科':
      return new Student(name, ['政治', '历史', '地理']);
      break;
    case '理科':
      return new Student(name, ['化学', '物理', '生物']);
      break;
    default:
      throw new Error('没有当前学科');
  }
}

let whh = studentFactory('whh', '文科');
let lsd = studentFactory('lsd', '理科');
console.log(whh, lsd);
// Student { name: 'whh', subjects: [ '政治', '历史', '地理' ] }
// Student { name: 'lsd', subjects: [ '化学', '物理', '生物' ] }
           

以上就是一个标准的工厂模式,当我们需要去记录(new)一个学生的时候,我们并不需要去关注这个学生的subjects,

我们只需要去分辨这个同学是文科还是理科,而不用考虑这个同学的具体实现的过程。

拓展一下,校长突然要求通过每个老师带的科目分辨一下文理科老师,这样让文科老师一起开会,理科老师一起开会。

只需要在拓展一个Teacher类就可以了。

/**
 * 创建老师类
 * @param {string} name 姓名 
 * @param {*} job  工作
 * @return {Teacher}
 */

function Teacher(name, job){
    this.name = name;
    this.job = job;
}

function personFactory(name, type) {
  switch (type) {
    case '文科':
      return new Student(name, ['政治', '历史', '地理']);
      break;
    case '理科':
      return new Student(name, ['化学', '物理', '生物']);
      break;
    case '教化学':
      return new Teacher(name,'理科老师');
    case '教历史':
      return new Teacher(name,'文科老师'); 
    default:
      throw new Error('没有当前学科');
  }
}

let whh = personFactory('whh', '文科');
let lsd = personFactory('lsd', '理科');
console.log(whh, lsd);
// Student { name: 'whh', subjects: [ '政治', '历史', '地理' ] }
// Student { name: 'lsd', subjects: [ '化学', '物理', '生物' ] }
let lhm = personFactory('lhm','教化学');
let stt = personFactory('stt','教历史');
console.log(lhm,stt);
// Teacher { name: 'lhm', job: '理科老师' } 
// Teacher { name: 'stt', job: '文科老师' }
           

***工厂模式的优点:***

1.一个调用者想创建一个对象,只需要知道其名称就可以了。

2.拓展性高,如果想要增加一个产品,只需要拓展一个工厂类就可以了。

***工厂模式的缺点:***

1.每次新增加一个需求的时候,就需要创建一个新的对象(Teacher)和实现具体工厂,

导致系统中类的个数成倍增加,一定程度上增加了系统的复杂度。

继续阅读