天天看點

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)和實作具體工廠,

導緻系統中類的個數成倍增加,一定程度上增加了系統的複雜度。

繼續閱讀