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)和實作具體工廠,
導緻系統中類的個數成倍增加,一定程度上增加了系統的複雜度。