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