Android編程設(shè)計(jì)模式之工廠方法模式實(shí)例詳解
本文實(shí)例講述了Android編程設(shè)計(jì)模式之工廠方法模式。分享給大家供大家參考,具體如下:
一、介紹
工廠方法模式(Factory Pattern),是創(chuàng)建型設(shè)計(jì)模式之一。工廠方法模式是一種結(jié)構(gòu)簡(jiǎn)單的模式,其在我們平時(shí)開發(fā)中應(yīng)用很廣泛,也許你并不知道,但是你已經(jīng)使用了無(wú)數(shù)次該模式了,如Android中的Activity里的各個(gè)生命周期方法,以onCreate方法為例,它就可以看作是一個(gè)工廠方法,我們?cè)谄渲锌梢詷?gòu)造我們的View并通過(guò)setContentView返回給framework處理等,相關(guān)內(nèi)容我們下面再講,先看看工廠方法模式定義。
二、定義
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類。
三、使用場(chǎng)景
在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。復(fù)雜對(duì)象適合使用工廠模式,用new就可以完成創(chuàng)建的對(duì)象無(wú)需使用工廠模式。
四、模式的簡(jiǎn)單實(shí)現(xiàn)
抽象產(chǎn)品類:
public abstract class Product { /** * 產(chǎn)品類的抽象方法 * 由具體的產(chǎn)品類去實(shí)現(xiàn) * */ public abstract void method(); }
具體產(chǎn)品類A:
public class ConcreteProductA extends Product { @Override public void method() { System.out.println("我是具體的產(chǎn)品A"); } }
具體產(chǎn)品類B:
public class ConcreteProductB extends Product { @Override public void method() { System.out.println("我是具體的產(chǎn)品B"); } }
抽象工廠類:
public abstract class Factory { /** * 抽象工廠方法 * 具體由子類實(shí)現(xiàn) * * @return 具體的產(chǎn)品對(duì)象 * */ public abstract Product createProduct(); }
具體工廠類:
public class ConcreteFactory extends Factory { /** * 具體工廠類 * */ @Override public Product createProduct() { return new ConcreteProductA(); } }
客戶類:
public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product product = factory.createProduct(); product.method(); } }
結(jié)果:
我是具體的產(chǎn)品A
這里的幾個(gè)角色都很簡(jiǎn)單,主要分為四大模塊,一是抽象工廠,其為工廠方法模式的核心;二是具體工廠,其實(shí)現(xiàn)了具體的業(yè)務(wù)邏輯;三是抽象產(chǎn)品,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類;四是具體產(chǎn)品,為實(shí)現(xiàn)抽象產(chǎn)品的某個(gè)具體產(chǎn)品的對(duì)象。
上述的代碼中我們?cè)贑lient類中構(gòu)造了一個(gè)工廠對(duì)象,并通過(guò)其生產(chǎn)了一個(gè)產(chǎn)品對(duì)象,這里我們得到的產(chǎn)品對(duì)象是ConcreteProductA的實(shí)例,如果想得到ConcreteProductB的實(shí)例,更改ConcreteFactory中的邏輯即可:
public class ConcreteFactory extends Factory { /** * 具體工廠類 * */ @Override public Product createProduct() { //return new ConcreteProductA(); return new ConcreteProductB(); } }
這種方式比較常見(jiàn),需要哪一個(gè)產(chǎn)品就生產(chǎn)哪一個(gè),有時(shí)候也可以利用反射的方式更簡(jiǎn)潔的來(lái)生產(chǎn)具體產(chǎn)品對(duì)象,此時(shí),需要在工廠方法的參數(shù)列表中傳入一個(gè)Class類來(lái)決定是哪一個(gè)產(chǎn)品類:
public abstract class Factory { /** * 抽象工廠方法 * 具體由子類實(shí)現(xiàn) * * @param clz 產(chǎn)品對(duì)象類類型 * * @return 具體的產(chǎn)品對(duì)象 * */ public abstract <T extends Product> T createProduct(Class<T> clz); }
對(duì)于具體的工廠類,則通過(guò)反射獲取類的示例即可:
public class ConcreteFactory extends Factory { /** * 具體工廠類 * */ @SuppressWarnings("unchecked") @Override public <T extends Product> T createProduct(Class<T> clz) { Product product = null; try { product = (Product) Class.forName(clz.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T)product; } }
最后在看看Client中的實(shí)現(xiàn):
public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product product = factory.createProduct(ConcreteProductB.class); product.method(); } }
需要哪一個(gè)類的對(duì)象就傳入哪一個(gè)類的類型即可,這種方法比較簡(jiǎn)潔、動(dòng)態(tài),如果你不喜歡這種方式,也可以嘗試為每一個(gè)產(chǎn)品都定義一個(gè)具體的工廠,各司其職。
public class ConcreteFactoryA extends Factory { /** * 具體工廠類 **/ @Override public Product createProduct() { return new ConcreteProductA(); } } public class ConcreteFactoryB extends Factory { /** * 具體工廠類 **/ @Override public Product createProduct() { return new ConcreteProductB(); } } public class Client { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.method(); Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.method(); } }
像這樣擁有多個(gè)工廠的方式我們稱為多工廠方法模式,同樣的,回到我們最初的那個(gè)工廠方法模式,當(dāng)我們的工廠只有一個(gè)的時(shí)候,我們還是為工廠提供了一個(gè)抽象類,那么,我們是否可以將其簡(jiǎn)化掉呢?如果確定你的工廠類只有一個(gè),那么簡(jiǎn)化掉抽象類是肯定沒(méi)問(wèn)題的,我們只需要將對(duì)應(yīng)的工廠方法改為靜態(tài)方法即可:
public class Factory { /** * 具體工廠類 **/ @Override public static Product createProduct() { return new ConcreteProductA(); } }
像這樣的方式又稱為簡(jiǎn)單工廠模式或靜態(tài)工廠模式,它是工廠方法模式的一個(gè)弱化版本。
其實(shí)到這里大家應(yīng)該可以發(fā)現(xiàn),工廠方法模式是完全符合設(shè)計(jì)原則的,其降低了對(duì)象之間的耦合度,而且,工廠方法模式依賴于抽象的架構(gòu),其將實(shí)例化的任務(wù)交由子類去完成,有非常好的擴(kuò)展性。
五、Android源碼中的工廠方法模式
Activity的各種生命周期
ArrayList和HashSet
六、總結(jié)
優(yōu)點(diǎn):
工廠方法模式完全符合設(shè)計(jì)原則,降低了對(duì)象之間的耦合。高層模塊只需要知道產(chǎn)品的抽象類,其他的實(shí)現(xiàn)都不需要關(guān)心。
良好的封裝性,代碼結(jié)構(gòu)清晰。擴(kuò)展性好。
缺點(diǎn):
每次我們?yōu)楣S方法模式添加新的產(chǎn)品時(shí)就要編寫一個(gè)新的產(chǎn)品類。同時(shí)還要引入抽象層,這必然會(huì)導(dǎo)致類結(jié)構(gòu)的復(fù)雜化,所以,在某些情況比較簡(jiǎn)單時(shí),是否要使用工廠模式,需要設(shè)計(jì)者權(quán)衡利弊了。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android編程設(shè)計(jì)模式之模板方法模式詳解
- Android編程設(shè)計(jì)模式之迭代器模式詳解
- Android編程設(shè)計(jì)模式之備忘錄模式詳解
- Android編程設(shè)計(jì)模式之命令模式詳解
- Android編程設(shè)計(jì)模式之解釋器模式詳解
- Android編程設(shè)計(jì)模式之責(zé)任鏈模式詳解
- Android編程設(shè)計(jì)模式之狀態(tài)模式詳解
- Android編程設(shè)計(jì)模式之策略模式詳解
- Android編程設(shè)計(jì)模式之抽象工廠模式詳解
- android設(shè)計(jì)模式之單例模式詳解
- Android設(shè)計(jì)模式系列之組合模式
- Android編程設(shè)計(jì)模式之訪問(wèn)者模式詳解
相關(guān)文章
Android實(shí)現(xiàn)為L(zhǎng)istView同時(shí)設(shè)置點(diǎn)擊時(shí)的背景和點(diǎn)擊松手之后的背景
這篇文章主要介紹了Android實(shí)現(xiàn)為L(zhǎng)istView同時(shí)設(shè)置點(diǎn)擊時(shí)的背景和點(diǎn)擊松手之后的背景,以實(shí)例形式較為詳細(xì)的分析了界面元素與功能的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02Android開發(fā) 旋轉(zhuǎn)屏幕導(dǎo)致Activity重建解決方法
Android開發(fā)文檔上專門有一小節(jié)解釋這個(gè)問(wèn)題。簡(jiǎn)單來(lái)說(shuō),Activity是負(fù)責(zé)與用戶交互的最主要機(jī)制,接下來(lái)為您詳細(xì)介紹2012-11-11Android 判斷SIM卡屬于哪個(gè)移動(dòng)運(yùn)營(yíng)商的實(shí)現(xiàn)代碼
有時(shí)候我們需要在Android中獲取本機(jī)網(wǎng)絡(luò)提供商呢,這里簡(jiǎn)單分享下,方便需要的朋友2013-05-05Android 實(shí)現(xiàn)伸縮布局效果示例代碼
這篇文章主要介紹了Android 實(shí)現(xiàn)伸縮布局效果的示例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01Android中Handler實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式
本篇文章主要介紹了Android中Handler實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07android TextView中識(shí)別多個(gè)url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解
在本篇文章里小編給大家整理的是關(guān)于android TextView中識(shí)別多個(gè)url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解,需要的朋友們可以學(xué)習(xí)參考下。2019-08-08Android編程中context及全局變量實(shí)例詳解
這篇文章主要介紹了Android編程中context及全局變量的用法,結(jié)合實(shí)例形式較為詳細(xì)的分析講述了context及全局變量的使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-12-12Android學(xué)習(xí)筆記——Menu介紹(一)
Android3.0(API level 11)開始,Android設(shè)備不再需要專門的菜單鍵。隨著這種變化,Android app應(yīng)該取消對(duì)傳統(tǒng)6項(xiàng)菜單的依賴。取而代之的是提供anction bar來(lái)提供基本的用戶功能2014-10-10