上一篇的工廠方法模式引入了工廠等級(jí)結(jié)構(gòu),解決了在原來(lái)簡(jiǎn)單工廠模式中工廠類(lèi)職責(zé)太重的原則,但是由于工廠方法模式的每個(gè)工廠只生產(chǎn)一類(lèi)產(chǎn)品,可能會(huì)導(dǎo)致系統(tǒng)中存在大量的工廠類(lèi),從而增加系統(tǒng)開(kāi)銷(xiāo)。那么,我們應(yīng)該怎么來(lái)重構(gòu)?似乎,我們可以考慮將一些相關(guān)的產(chǎn)品組成一個(gè)“產(chǎn)品族”,由同一個(gè)工廠來(lái)統(tǒng)一生產(chǎn),這就是本次將要學(xué)習(xí)的抽象工廠模式的基本思想。
抽象工廠模式(Abstract Factory) | 學(xué)習(xí)難度:★★★★☆ | 使用頻率:★★★★★ |
一、界面皮膚庫(kù)的初始設(shè)計(jì)
M公司IT開(kāi)發(fā)部接到一個(gè)開(kāi)發(fā)任務(wù),想要對(duì)以前的一個(gè)系統(tǒng)開(kāi)發(fā)一套界面皮膚庫(kù),可以對(duì)該桌面系統(tǒng)軟件進(jìn)行界面美化。這樣,用戶就可以在使用時(shí)通過(guò)菜單來(lái)選擇皮膚,不同的皮膚將提供視覺(jué)效果不同的按鈕、文本框以及組合框等界面元素,其結(jié)構(gòu)示意圖如下所示:
該皮膚庫(kù)需要具備良好的靈活性和可擴(kuò)展性,用戶可以自由選擇不同的皮膚,開(kāi)發(fā)人員也可以在不修改既有代碼的基礎(chǔ)上增加新的皮膚。
M公司的開(kāi)發(fā)人員針對(duì)上述需求,決定現(xiàn)學(xué)現(xiàn)賣(mài),在上次使用了工廠方法模式之后對(duì)工廠方法模式大為贊賞,決定使用工廠方法模式來(lái)進(jìn)行系統(tǒng)的設(shè)計(jì),為了保證系統(tǒng)的靈活性和可擴(kuò)展性,提供一系列具體工廠來(lái)創(chuàng)建按鈕、文本框以及組合框等界面元素,客戶端針對(duì)抽象工廠來(lái)編程,初始結(jié)構(gòu)如下圖所示:
從上圖可以看出,此方案提供了大量的工廠來(lái)創(chuàng)建具體的界面組件,可以通過(guò)配置文件來(lái)更換具體界面組件從而改變界面的風(fēng)格,但是,此方案存在以下問(wèn)題:
?。?)需要增加新的皮膚時(shí),雖然不需要更改現(xiàn)有代碼,但是需要增加大量的類(lèi),針對(duì)每一個(gè)新增具體組件都要增加一個(gè)具體工廠,類(lèi)的個(gè)數(shù)會(huì)成對(duì)增加。這無(wú)疑會(huì)導(dǎo)致系統(tǒng)越來(lái)越龐大,從而增加了系統(tǒng)的維護(hù)成本和運(yùn)行開(kāi)銷(xiāo)。
?。?)由于同一種風(fēng)格的不同界面組件通常需要一起顯示,因此需要為每個(gè)組件都選擇一個(gè)具體工廠,用戶在使用時(shí)必須逐個(gè)進(jìn)行設(shè)置,如果某個(gè)具體工廠選擇失誤將會(huì)導(dǎo)致界面顯示混亂,雖然可以適當(dāng)增加一些約束語(yǔ)句,但是客戶端代碼和配置文件都較為復(fù)雜。
綜上所述,如何減少系統(tǒng)中類(lèi)的個(gè)數(shù)并保證客戶端每次始終就只使用一種風(fēng)格的具體界面組件?這是縈繞在M公司開(kāi)發(fā)人員心頭的兩個(gè)問(wèn)題。