Android中,工廠模式分為三種:簡(jiǎn)單工廠模式四苇、工廠方法模式、抽象工廠模式方咆。
一.簡(jiǎn)單工廠模式月腋。
定義:簡(jiǎn)單工廠模式又叫靜態(tài)方法模式(因?yàn)楣S類定義了一個(gè)靜態(tài)方法);簡(jiǎn)單工廠模式可以理解為負(fù)責(zé)生產(chǎn)對(duì)象的一個(gè)類瓣赂,稱為“工廠類”榆骚。
概括:Concrete Product 具有共同的父類Product。工廠類Factory只有一個(gè)煌集,沒有子父類妓肢,通過(guò)向Factory的static方法中傳入不同的參數(shù),得到返回的不同的Concrete Product苫纤。
總結(jié):一個(gè)抽象產(chǎn)品類碉钠,可以派生出多個(gè)具體產(chǎn)品類。一個(gè)具體工廠類卷拘,通過(guò)往此工廠的static方法中傳入不同參數(shù)喊废,產(chǎn)出不同的具體產(chǎn)品類實(shí)例。
優(yōu)點(diǎn):
1.將創(chuàng)建實(shí)例的工作與使用實(shí)例的工作分開恭金,使用者不必關(guān)心類對(duì)象如何創(chuàng)建操禀,實(shí)現(xiàn)了解耦;
2.把初始化實(shí)例時(shí)的工作放到工廠里進(jìn)行横腿,使代碼更容易維護(hù)颓屑。 更符合面向?qū)ο蟮脑瓌t & 面向接口編程,而不是面向?qū)崿F(xiàn)編程耿焊。
缺點(diǎn):
1.工廠類集中了所有實(shí)例(產(chǎn)品)的創(chuàng)建邏輯揪惦,一旦這個(gè)工廠不能正常工作,整個(gè)系統(tǒng)都會(huì)受到影響罗侯;
2.違背“開放 - 關(guān)閉原則”器腋,一旦添加新產(chǎn)品就不得不修改工廠類的邏輯,這樣就會(huì)造成工廠邏輯過(guò)于復(fù)雜。
3.簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法纫塌,靜態(tài)方法不能被繼承和重寫诊县,會(huì)造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)。
二 措左、工廠方法模式
定義:工廠方法模式依痊,又稱工廠模式、多態(tài)工廠模式和虛擬構(gòu)造器模式怎披,通過(guò)定義工廠父類負(fù)責(zé)定義創(chuàng)建對(duì)象的公共接口胸嘁,而子類則負(fù)責(zé)生成具體的對(duì)象。
概括:Concrete Product 具有共同的父類Product 凉逛,Concrete Factory也具有共同的父類Factory性宏。每個(gè)具體的子類Concrete Factory 產(chǎn)出一個(gè)對(duì)應(yīng)的Concrete Product。
總結(jié):
一個(gè)抽象產(chǎn)品類状飞,可以派生出多個(gè)具體產(chǎn)品類毫胜。一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類昔瞧。每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例指蚁。
優(yōu)點(diǎn):
1、更符合開-閉原則
新增一種產(chǎn)品時(shí)自晰,只需要增加相應(yīng)的具體產(chǎn)品類和相應(yīng)的工廠子類即可凝化,而簡(jiǎn)單工廠模式需要修改工廠類的判斷邏輯
2、符合單一職責(zé)原則
每個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品酬荞,而簡(jiǎn)單工廠中的工廠類存在復(fù)雜的switch邏輯判斷
3搓劫、不使用靜態(tài)工廠方法,可以形成基于繼承的等級(jí)結(jié)構(gòu)混巧,而簡(jiǎn)單工廠模式的工廠類使用靜態(tài)工廠方法
總結(jié):工廠模式可以說(shuō)是簡(jiǎn)單工廠模式的進(jìn)一步抽象和拓展枪向,在保留了簡(jiǎn)單工廠的封裝優(yōu)點(diǎn)的同時(shí),讓擴(kuò)展變得簡(jiǎn)單咧党,讓繼承變得可行秘蛔,增加了多態(tài)性的體現(xiàn)。
缺點(diǎn):
1傍衡、添加新產(chǎn)品時(shí)深员,除了增加新產(chǎn)品類外,還要提供與之對(duì)應(yīng)的具體工廠類蛙埂,系統(tǒng)類的個(gè)數(shù)將成對(duì)增加倦畅,在一定程度上增加了系統(tǒng)的復(fù)雜度;同時(shí)绣的,有更多的類需要編譯和運(yùn)行叠赐,會(huì)給系統(tǒng)帶來(lái)一些額外的開銷欲账;
2、由于考慮到系統(tǒng)的可擴(kuò)展性芭概,需要引入抽象層赛不,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度罢洲,且在實(shí)現(xiàn)時(shí)可能需要用到DOM俄删、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度奏路。
3、雖然保證了工廠方法內(nèi)的對(duì)修改關(guān)閉臊诊,但對(duì)于使用工廠方法的類鸽粉,如果要更換另外一種產(chǎn)品,仍然需要修改實(shí)例化的具體工廠類抓艳;
4触机、一個(gè)具體工廠只能創(chuàng)建一種具體產(chǎn)品
三、抽象工廠模式
定義:抽象工廠模式玷或,即Abstract Factory Pattern儡首,提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)須指定它們具體的類偏友;具體的工廠負(fù)責(zé)實(shí)現(xiàn)具體的產(chǎn)品實(shí)例蔬胯。
概括:
抽象工廠模式引入抽象產(chǎn)品族Abstract Product 的概念,它是所有產(chǎn)品的父類位他,其下是Product抽象類氛濒,它是Abstract Product的子類,是具體產(chǎn)品類的父類鹅髓,可有多種不同類型舞竿,如ProductA 、Product B窿冯,再往下骗奖,是具體的產(chǎn)品類 Concrete ProductA 、Concrete ProductB醒串;
Concrete Factory 有共同的父類Abstract Factory执桌。每個(gè)具體的Concrete Factory都可以生產(chǎn)多種不同產(chǎn)品。如Factory 1 可以生產(chǎn)Concrete ProductA1厦凤、Concrete Product B1鼻吮,F(xiàn)actory 2可以生產(chǎn)Concrete A2、Concrete B2较鼓。
總結(jié):
多個(gè)抽象產(chǎn)品類椎木,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類违柏。? ? 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類香椎。? ? 每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例漱竖。
優(yōu)點(diǎn):
1、降低耦合
抽象工廠模式將具體產(chǎn)品的創(chuàng)建延遲到具體工廠的子類中畜伐,這樣將對(duì)象的創(chuàng)建封裝起來(lái)馍惹,可以減少客戶端與具體產(chǎn)品類之間的依賴,從而使系統(tǒng)耦合度低玛界,這樣更有利于后期的維護(hù)和擴(kuò)展万矾;
2、更符合開-閉原則
新增一種產(chǎn)品類時(shí)慎框,只需要增加相應(yīng)的具體產(chǎn)品類和相應(yīng)的工廠子類即可良狈,而簡(jiǎn)單工廠模式需要修改工廠類的判斷邏輯
3、符合單一職責(zé)原則
4笨枯、每個(gè)具體工廠類只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品薪丁,而簡(jiǎn)單工廠中的工廠類存在復(fù)雜的switch邏輯判斷
5、不使用靜態(tài)工廠方法馅精,可以形成基于繼承的等級(jí)結(jié)構(gòu)严嗜,而簡(jiǎn)單工廠模式的工廠類使用靜態(tài)工廠方法
缺點(diǎn):
抽象工廠模式很難支持新種類產(chǎn)品的變化。
這是因?yàn)槌橄蠊S接口中已經(jīng)確定了可以被創(chuàng)建的產(chǎn)品集合洲敢,如果需要添加新產(chǎn)品漫玄,此時(shí)就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變压彭,這樣也就違背了“開發(fā)——封閉”原則称近。
總結(jié):
簡(jiǎn)單工廠模式:一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體產(chǎn)品類哮塞。一個(gè)具體工廠類刨秆,通過(guò)往此工廠的static方法中傳入不同參數(shù),產(chǎn)出不同的具體產(chǎn)品類實(shí)例忆畅。
工廠方法模式:一個(gè)抽象產(chǎn)品類衡未,可以派生出多個(gè)具體產(chǎn)品類。一個(gè)抽象工廠類家凯,可以派生出多個(gè)具體工廠類缓醋。每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例。
抽象工廠模式: 多個(gè)抽象產(chǎn)品類绊诲,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類送粱。? ? 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類掂之。? ? 每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例抗俄。