描述
工廠模式是一種創(chuàng)建型設(shè)計(jì)模式辫秧,也就是說是用來創(chuàng)建對(duì)象實(shí)例的般码。我們通常創(chuàng)建實(shí)例使用的都是new 構(gòu)造函數(shù)的方法妻率,為什么會(huì)使用工廠模式來創(chuàng)建對(duì)象了?事實(shí)上板祝,每一種設(shè)計(jì)模式都是為了解決特定的問題宫静,工廠模式也不例外。工廠模式主要是為了解決類的依賴券时,也就是說我們不需要在每次創(chuàng)建對(duì)象的時(shí)候孤里,都去糾結(jié)它的構(gòu)造函數(shù)是誰(當(dāng)項(xiàng)目中定義的類非常多的時(shí)候),或者說不去關(guān)注它的具體的創(chuàng)建過程橘洞,而是將創(chuàng)建過程封裝在一個(gè)函數(shù)中捌袜,這個(gè)函數(shù)被稱為工廠函數(shù)。
工廠模式的代碼實(shí)現(xiàn)
//用于創(chuàng)建實(shí)例的類
class People {
constructor(name){
this.name = name;
}
init(){
console.log('init')
};
fn1(){
console.log('fn1');
};
fn2(){
console.log('fn2')
}
}
//工廠函數(shù)所在的類
class Creator {
create(name){
// 通過工廠函數(shù)返回一個(gè)實(shí)例
return new People(name);
}
}
從上面的代碼中我們可以看到炸枣,首先定義了一個(gè)People類虏等,然后定義了一個(gè)Creator類弄唧,這個(gè)類中有一個(gè)create函數(shù)返回People類的實(shí)例。這就是一個(gè)簡單的工廠模式霍衫,下面我們使用這個(gè)工廠函數(shù)來創(chuàng)建實(shí)例對(duì)象候引。
let creator = new Creator();
//調(diào)用工廠函數(shù)來創(chuàng)建實(shí)例
let p = creator.create('p1');
p.init();// init
p.fn1(); // fn1
p.fn2(); // fn2
console.log(p instanceof People) // true
分析上面的代碼,我們通過工廠函數(shù)creator.create()創(chuàng)建了實(shí)例p,在整個(gè)創(chuàng)建的過程中沒有看到People類敦跌,也就是說具體的創(chuàng)建過程是不可見的澄干,我們只需要關(guān)注創(chuàng)建的結(jié)果。
工廠模式的應(yīng)用場景
-
當(dāng)我們不希望使用構(gòu)造函數(shù)來進(jìn)行創(chuàng)建對(duì)象的時(shí)候峰髓,可以使用工廠模式創(chuàng)建對(duì)象
這句話可能有點(diǎn)廢話的感覺傻寂,下面給出幾個(gè)可能存在這樣的場景。比如jQuery中的鏈?zhǔn)秸{(diào)用携兵。$('div')就是使用工廠模式創(chuàng)建的對(duì)象疾掰,正是因?yàn)槭褂玫墓S模式創(chuàng)建的對(duì)象,所以才能夠?qū)崿F(xiàn)鏈?zhǔn)秸{(diào)用徐紧。想象一下如果使用new 構(gòu)造函數(shù)來進(jìn)行調(diào)用
new $('div').css() 這種調(diào)用方法肯定是不可行的静檬。
-
當(dāng)項(xiàng)目中類非常多的時(shí)候,我們可以通過工廠模式來創(chuàng)建對(duì)象并级。
// People類
class People {
constructor(name){
this.name = name;
}
service(){
console.log('service')
};
}
// 學(xué)生類
class Student {
constructor(name){
this.name = name;
}
study(){
console.log('study')
};
}
// Teacher類
class Teacher {
constructor(name){
this.name = name;
}
teach(){
console.log('teach')
};
}
//工廠函數(shù)來創(chuàng)建對(duì)象
class Creator {
create(role){
switch (role) {
case 'people':
return new People('name');
break;
case 'student':
return new Student('name');
break;
case 'teacher':
return new Teacher('name');
break;
default:
throw new Error('參數(shù)錯(cuò)誤, 可選參數(shù):superAdmin拂檩、admin、user');
}
return new People(name);
}
}
從上面的代碼中嘲碧,我們可以看到有多個(gè)類稻励,People類,學(xué)生類愈涩,教師類望抽。假設(shè)我們一個(gè)項(xiàng)目中有非常多的類,我們每次創(chuàng)建一個(gè)實(shí)例時(shí)都得去找到這個(gè)類履婉,這樣的話可能比較麻煩煤篙。假設(shè)使用工廠模式,通過工廠函數(shù)來創(chuàng)建對(duì)象毁腿,就避免了構(gòu)造函數(shù)的問題辑奈。看下面的具體調(diào)用代碼已烤。
let creator = new Creator();
//調(diào)用工廠函數(shù)來創(chuàng)建實(shí)例
let people = creator.create('people');
people.service(); // service
let student = creator.create('student');
student.study(); // study
let teacher = creator.create('teacher');
teacher.teach(); // teach
我們可以發(fā)現(xiàn)鸠窗,通過工廠函數(shù)我們實(shí)現(xiàn)了People類,Student類和教師類等多個(gè)類的實(shí)例的創(chuàng)建胯究。也就是說 工廠模式可以用來實(shí)現(xiàn)創(chuàng)建多個(gè)類的實(shí)例姨丈。
總結(jié)
- 工廠模式是用來創(chuàng)建類的實(shí)例枯怖,它不關(guān)注具體的創(chuàng)建過程扰肌,只關(guān)注創(chuàng)建結(jié)果。
- 工廠模式可以用來實(shí)現(xiàn)多個(gè)類的實(shí)例的創(chuàng)建涨颜。