您好,登錄后才能下訂單哦!
這篇文章主要講解了“數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的”吧!
抽象工廠模式(Abstract Factory Pattern)隸屬于設(shè)計(jì)模式中的創(chuàng)建型模式,用于產(chǎn)品族的構(gòu)建。
抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類。(可以認(rèn)為抽象工廠是對(duì)具有同一主題的一組單獨(dú)工廠方法的封裝)
抽象工廠模式中有一個(gè)產(chǎn)品族的概念,理解了產(chǎn)品族就算是抽象工廠入門了。所謂產(chǎn)品族,就是一系列相關(guān)的產(chǎn)品對(duì)象組成的一族對(duì)象,它們是獨(dú)立的同時(shí)也是互相關(guān)聯(lián)的,它們共同組合在一起可以變成一個(gè)更大的產(chǎn)品。舉例來說,Mac 電腦里所有的 UI 組件是一個(gè)產(chǎn)品族,存在 MacButton
MacText
等組件,對(duì)應(yīng)的 Windows 電腦里所有的 UI 組件也組成了一個(gè)產(chǎn)品族,存在 WindowsButton
, WindowsText
等組件,兩個(gè)產(chǎn)品族里的產(chǎn)品是不同混合使用的。
抽象工廠模式中存在四種角色,跟工廠方法類似,分別是抽象工廠接口,具體工廠實(shí)現(xiàn),抽象產(chǎn)品接口,具體產(chǎn)品實(shí)現(xiàn)。
不同之處在于抽象產(chǎn)品接口會(huì)存在多個(gè),而且它們之間具有內(nèi)在的相關(guān)關(guān)系。
在工廠方法模式中,我們舉了造車的例子,其實(shí)造車這個(gè)例子擴(kuò)展一下也非常適合于講解抽象工廠模式;上面在說明產(chǎn)品族時(shí)舉了Mac 和 Windows 電腦的例子。這里我們使用組裝電腦來演示。
現(xiàn)在組裝電腦不多見了,一般都是筆記本或一體機(jī),以前大家去賣場里單獨(dú)買 CPU,主板,顯示器等組件可以組裝出一臺(tái)電腦來,在我們的系統(tǒng)里,我們有各種組件,用戶可以選擇不同的組件來組裝自己喜歡的電腦。
但有一點(diǎn)需要注意,主板和 CPU 是需要兼容才能使用的,不是隨便搭在一起就成為一臺(tái)電腦了。
// 產(chǎn)品接口 public interface MainBoard { public void setCpu(); public void run(); } public interface Cpu { public void doLogic(); } // 具體產(chǎn)品實(shí)現(xiàn) public class IntelMainBoard implements MainBoard { private Cpu cpu; public void run() { System.out.println("IntelMainBoard is running."); } public void setCpu(Cpu cpu) { this.cpu = cpu; } } public class AmdMainBoard implements MainBoard { private Cpu cpu; public void run() { System.out.println("AmdMainBoard is running."); } public void setCpu(Cpu cpu) { this.cpu = cpu; } } public class IntelCpu implements Cpu { public void doLogic() { System.out.println("IntelCpu is doing logic"); } } public class AmdCpu implements Cpu { public void doLogic() { System.out.println("AmdCpu is doing logic"); } }
如果由用戶自行組裝,很可能由于Amd 的主板使用了 Intel 的CPU,導(dǎo)致組裝起來的電腦不能正常運(yùn)行,而且這些細(xì)節(jié)也不需要用戶操心。
此時(shí)我們的抽象工廠模式就登場了,抽象工廠就像是賣場工作人員提供給你的幾種套餐一樣,定義了組裝電腦的套餐,用戶可以直接使用套餐里的組件然后組裝成電腦,這樣就絕對(duì)不會(huì)出現(xiàn)兼容問題了。
// 抽象工廠接口 public interface ComponentAbstractFactory { public MainBoard getMainBoard(); public Cpu getCpu(); } // 具體工廠實(shí)現(xiàn) // Intel 系列 public class IntelAbstractFactory implements ComponentAbstractFactory { public MainBoard getMainBoard() { return new IntelMainBoard(); } public Cpu getCpu() { return new IntelCpu(); } } // Amd 系列電腦 public class AmdAbstractFactory implements ComponentAbstractFactory { public MainBoard getMainBoard() { return new AmdMainBoard(); } public Cpu getCpu() { return new AmdCpu(); } }
有了套餐用戶不需要擔(dān)心不兼容,可以愉快的組裝電腦然后使用了。
// 電腦接口 public interface Computer { // 裝好主板,cpu 裝在主板上 public void setMainBoard(MainBoard mainBoard); //其他的需要放置的東西 public void otherSettings(); public void run(); } // 組裝電腦 public class ComboComputer implements Computer { // 裝好主板,cpu 裝在主板上 public void setMainBoard(MainBoard mainBoard){ //.. } //其他的需要設(shè)置的東西 public void otherSettings() { //.... } public void run() { mainBoard.run(); } } public class Client { public static void main(String[] args) { Computer computer = new ComboComputer(); ComponentAbstractFactory factory = new AmdAbstractFactory(); MainBoard mainBoard = factory.getMainBoard(); Cpu cpu = factory.getCpu(); mainBoard.setCpu(cpu); computer.setMainBoard(mainBoard); computer.run(); } }
大家有沒有發(fā)現(xiàn),用戶為了組裝一臺(tái)電腦出來,雖然不需要了解cpu 廠家之類的細(xì)節(jié)的,還是要了解cpu 怎么裝到主板上,主板又怎么裝到電腦上,然后才能得到一臺(tái)完整的電腦,這里又可以用到前一節(jié)說的工廠方法模式來幫助用戶將電腦組裝起來了。
抽象工廠最初是來自操作系統(tǒng)之間的UI 構(gòu)建,每個(gè)系統(tǒng)有自己的一套 UI界面,現(xiàn)在這個(gè)限制已經(jīng)不是很強(qiáng)了,就像Intel 的主板也可以裝載AMD 的CPU,這通過再實(shí)現(xiàn)一個(gè)抽象工廠類就可以了,還有其他的例子譬如電腦的主題,里面包含字體、背景、策略等一系列產(chǎn)品構(gòu)成的產(chǎn)品族也適合于使用抽象工廠模式。
適合于產(chǎn)品之間相互關(guān)聯(lián)、相互依賴且相互約束的地方
需要?jiǎng)討B(tài)切換產(chǎn)品族的地方
優(yōu)點(diǎn):
抽象工廠模式將產(chǎn)品族的依賴與約束關(guān)系放到抽象工廠中,便于管理。
職責(zé)解耦,用戶不需要關(guān)心一堆自己不關(guān)心的細(xì)節(jié),由抽象工廠來負(fù)責(zé)組件的創(chuàng)建
切換產(chǎn)品族容易,只需要增加一個(gè)具體工廠實(shí)現(xiàn),客戶端選擇另一個(gè)套餐就可以了
缺點(diǎn):
抽象工廠模式類增加的速度很快,有一個(gè)產(chǎn)品族就需要增加一個(gè)具體工廠實(shí)現(xiàn),比較繁瑣
產(chǎn)品族難以擴(kuò)展產(chǎn)品。當(dāng)產(chǎn)品族中增加一個(gè)產(chǎn)品時(shí),抽象工廠接口中需要增加一個(gè)函數(shù),對(duì)應(yīng)的所有具體工廠實(shí)現(xiàn)都需要修改,修改放大嚴(yán)重。
抽象工廠并未完全屏蔽創(chuàng)建細(xì)節(jié),給出的都是組件。對(duì)于這種情況可以結(jié)合工廠模式或簡單工廠模式一起使用。
大家應(yīng)該已經(jīng)發(fā)現(xiàn)了,其實(shí)抽象工廠模式如果只有一個(gè)組件的話,其實(shí)是退化到了工廠方法模式,也就是沒有了產(chǎn)品族的概念,只剩一個(gè)產(chǎn)品了,因此簡單工廠,工廠方法,抽象工廠這三者之間是有內(nèi)在聯(lián)系的,區(qū)別只是產(chǎn)品的復(fù)雜度。
抽象工廠的本質(zhì)是選擇產(chǎn)品族,因此大家可以根據(jù)這個(gè)特征來識(shí)別是否可以應(yīng)用抽象工廠。
感謝各位的閱讀,以上就是“數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。