這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Android中工廠方法模式的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
烏拉特后ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
一、介紹
工廠方法模式(Factory Pattern),是創(chuàng)建型設(shè)計模式之一。工廠方法模式是一種結(jié)構(gòu)簡單的模式,其在我們平時開發(fā)中應(yīng)用很廣泛,也許你并不知道,但是你已經(jīng)使用了無數(shù)次該模式了,如Android中的Activity里的各個生命周期方法,以onCreate方法為例,它就可以看作是一個工廠方法,我們在其中可以構(gòu)造我們的View并通過setContentView返回給framework處理等,相關(guān)內(nèi)容我們下面再講,先看看工廠方法模式定義。
二、定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪個類。
三、使用場景
在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式。復(fù)雜對象適合使用工廠模式,用new就可以完成創(chuàng)建的對象無需使用工廠模式。
四、模式的簡單實(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)品對象 * */ 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
這里的幾個角色都很簡單,主要分為四大模塊,一是抽象工廠,其為工廠方法模式的核心;二是具體工廠,其實(shí)現(xiàn)了具體的業(yè)務(wù)邏輯;三是抽象產(chǎn)品,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類;四是具體產(chǎn)品,為實(shí)現(xiàn)抽象產(chǎn)品的某個具體產(chǎn)品的對象。
上述的代碼中我們在Client類中構(gòu)造了一個工廠對象,并通過其生產(chǎn)了一個產(chǎn)品對象,這里我們得到的產(chǎn)品對象是ConcreteProductA的實(shí)例,如果想得到ConcreteProductB的實(shí)例,更改ConcreteFactory中的邏輯即可:
public class ConcreteFactory extends Factory { /** * 具體工廠類 * */ @Override public Product createProduct() { //return new ConcreteProductA(); return new ConcreteProductB(); } }
這種方式比較常見,需要哪一個產(chǎn)品就生產(chǎn)哪一個,有時候也可以利用反射的方式更簡潔的來生產(chǎn)具體產(chǎn)品對象,此時,需要在工廠方法的參數(shù)列表中傳入一個Class類來決定是哪一個產(chǎn)品類:
public abstract class Factory { /** * 抽象工廠方法 * 具體由子類實(shí)現(xiàn) * * @param clz 產(chǎn)品對象類類型 * * @return 具體的產(chǎn)品對象 * */ public abstract <T extends Product> T createProduct(Class<T> clz); }
對于具體的工廠類,則通過反射獲取類的示例即可:
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(); } }
需要哪一個類的對象就傳入哪一個類的類型即可,這種方法比較簡潔、動態(tài),如果你不喜歡這種方式,也可以嘗試為每一個產(chǎn)品都定義一個具體的工廠,各司其職。
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(); } }
像這樣擁有多個工廠的方式我們稱為多工廠方法模式,同樣的,回到我們最初的那個工廠方法模式,當(dāng)我們的工廠只有一個的時候,我們還是為工廠提供了一個抽象類,那么,我們是否可以將其簡化掉呢?如果確定你的工廠類只有一個,那么簡化掉抽象類是肯定沒問題的,我們只需要將對應(yīng)的工廠方法改為靜態(tài)方法即可:
public class Factory { /** * 具體工廠類 **/ @Override public static Product createProduct() { return new ConcreteProductA(); } }
像這樣的方式又稱為簡單工廠模式或靜態(tài)工廠模式,它是工廠方法模式的一個弱化版本。
其實(shí)到這里大家應(yīng)該可以發(fā)現(xiàn),工廠方法模式是完全符合設(shè)計原則的,其降低了對象之間的耦合度,而且,工廠方法模式依賴于抽象的架構(gòu),其將實(shí)例化的任務(wù)交由子類去完成,有非常好的擴(kuò)展性。
五、Android源碼中的工廠方法模式
Activity的各種生命周期
ArrayList和HashSet
六、總結(jié)
優(yōu)點(diǎn):
工廠方法模式完全符合設(shè)計原則,降低了對象之間的耦合。高層模塊只需要知道產(chǎn)品的抽象類,其他的實(shí)現(xiàn)都不需要關(guān)心。
良好的封裝性,代碼結(jié)構(gòu)清晰。擴(kuò)展性好。
缺點(diǎn):
每次我們?yōu)楣S方法模式添加新的產(chǎn)品時就要編寫一個新的產(chǎn)品類。同時還要引入抽象層,這必然會導(dǎo)致類結(jié)構(gòu)的復(fù)雜化,所以,在某些情況比較簡單時,是否要使用工廠模式,需要設(shè)計者權(quán)衡利弊了。
上述就是小編為大家分享的Android中工廠方法模式的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前標(biāo)題:Android中工廠方法模式的作用是什么
本文來源:http://aaarwkj.com/article42/pccdec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站導(dǎo)航、商城網(wǎng)站、標(biāo)簽優(yōu)化、動態(tài)網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)