Android編程設(shè)計(jì)模式之抽象工廠模式詳解
本文實(shí)例講述了Android編程設(shè)計(jì)模式之抽象工廠模式。分享給大家供大家參考,具體如下:
一、介紹
抽象工廠模式(Abstract Factory Pattern),也是創(chuàng)建型設(shè)計(jì)模式之一。前一節(jié)我們已經(jīng)了解了工廠方法模式,那么這個(gè)抽象工廠又是怎么一回事呢?大家聯(lián)想一下現(xiàn)實(shí)生活中的工廠肯定都是具體的,也就是說每個(gè)工廠都會(huì)生產(chǎn)某一種具體的產(chǎn)品,那么抽象工廠意味著生產(chǎn)出來的產(chǎn)品是不確定的,那這豈不是很奇怪?抽象工廠模式起源于以前對不同操作系統(tǒng)的圖形化解決方案,如不同操作系統(tǒng)中的按鈕和文本框控件其實(shí)現(xiàn)不同,展示效果也不一樣,對于每一個(gè)操作系統(tǒng),其本身就構(gòu)成一個(gè)產(chǎn)品類,而按鈕與文本框控件也構(gòu)成一個(gè)產(chǎn)品類,兩種產(chǎn)品類兩種變化,各自有自己的特性,如Android中的Button和TextView,iOS中的Button和TextView,Window Phone中的Button和TextView等。
二、定義
為創(chuàng)建一組相關(guān)或者是相互依賴的對象提供一個(gè)接口,而不需要指定它們的具體類。
三、使用場景
一個(gè)對象族有相同的約束時(shí)可以使用抽象工廠模式。是不是聽起來很抽象?舉個(gè)例子,Android、iOS、Window Phone下都有短信軟件和撥號(hào)軟件,兩者都屬于Software軟件的范疇,但是,它們所在的操作系統(tǒng)平臺(tái)不一樣,即便是同一家公司出品的軟件,其代碼的實(shí)現(xiàn)邏輯也是不一樣的,這時(shí)候就可以考慮使用抽象工廠方法模式來產(chǎn)生Android、iOS、Window Phone下的短信軟件和撥號(hào)軟件。
四、抽象工廠模式的UML類圖
UML類圖:
雖然抽象工廠方法模式的種類繁多,但是,主要還是分為4類:
AbstractFactory:抽象工廠角色,它聲明了一組用于創(chuàng)建一種產(chǎn)品的方法,每一個(gè)方法對應(yīng)一種產(chǎn)品。
ConcreteFactory:具體的工廠角色,它實(shí)現(xiàn)了在抽象工廠中定義的創(chuàng)建產(chǎn)品的方法,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品種類,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中。
AbstractProduct:抽象產(chǎn)品角色,它為每種產(chǎn)品聲明接口。
ConcreteProduct:具體產(chǎn)品角色,它定義具體工廠生產(chǎn)的具體產(chǎn)品對象,實(shí)現(xiàn)抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法。
五、簡單實(shí)現(xiàn)
以車廠生產(chǎn)汽車零部件為例,A、B兩家車廠分別生產(chǎn)不同的輪胎、發(fā)動(dòng)機(jī)、制動(dòng)系統(tǒng)。雖然生產(chǎn)的零件不同,型號(hào)不同。但是根本上都有共同的約束,就是輪胎、發(fā)動(dòng)機(jī)、制動(dòng)系統(tǒng)。
輪胎相關(guān)類:
public interface ITire { /** * 輪胎 */ void tire(); } public class NormalTire implements ITire{ @Override public void tire() { System.out.println("普通輪胎"); } } public class SUVTire implements ITire{ @Override public void tire() { System.out.println("越野輪胎"); } }
發(fā)動(dòng)機(jī)相關(guān)類:
public interface IEngine { /** *發(fā)動(dòng)機(jī) */ void engine(); } public class DomesticEngine implements IEngine{ @Override public void engine() { System.out.println("國產(chǎn)發(fā)動(dòng)機(jī)"); } } public class ImportEngine implements IEngine{ @Override public void engine() { System.out.println("進(jìn)口發(fā)動(dòng)機(jī)"); } }
制動(dòng)系統(tǒng)相關(guān)類:
public interface IBrake { /** *制動(dòng)系統(tǒng) */ void brake(); } public class NormalBrake implements IBrake{ @Override public void brake() { System.out.println("普通制動(dòng)"); } } public class SeniorBrake implements IBrake{ @Override public void brake() { System.out.println("高級(jí)制動(dòng)"); } }
抽象車廠類:
public abstract class CarFactory { /** * 生產(chǎn)輪胎 * * @return 輪胎 * */ public abstract ITire createTire(); /** * 生產(chǎn)發(fā)動(dòng)機(jī) * * @return 發(fā)動(dòng)機(jī) * */ public abstract IEngine createEngine(); /** * 生產(chǎn)制動(dòng)系統(tǒng) * * @return 制動(dòng)系統(tǒng) * */ public abstract IBrake createBrake(); }
A車廠:
public class AFactory extends CarFactory{ @Override public ITire createTire() { return new NormalTire(); } @Override public IEngine createEngine() { return new DomesticEngine(); } @Override public IBrake createBrake() { return new NormalBrake(); } }
B車廠:
public class BFactory extends CarFactory{ @Override public ITire createTire() { return new SUVTire(); } @Override public IEngine createEngine() { return new ImportEngine(); } @Override public IBrake createBrake() { return new SeniorBrake(); } }
客戶類:
public class Client { public static void main(String[] args) { //A車廠 CarFactory factoryA = new AFactory(); factoryA.createTire().tire(); factoryA.createEngine().engine(); factoryA.createBrake().brake(); System.out.println("---------------"); //B車廠 CarFactory factoryB = new BFactory(); factoryB.createTire().tire(); factoryB.createEngine().engine(); factoryB.createBrake().brake(); } }
結(jié)果:
普通輪胎 國產(chǎn)發(fā)動(dòng)機(jī) 普通制動(dòng) ------------------ 越野輪胎 進(jìn)口發(fā)動(dòng)機(jī) 高級(jí)制動(dòng)
可以看出上面模擬了兩個(gè)車廠,如果有了C廠、D廠,各自廠家生產(chǎn)的零部件型號(hào)種類又不相同,那么我們創(chuàng)建的類文件就會(huì)翻倍。這也是抽象工廠模式的一個(gè)弊端,所以實(shí)際開發(fā)中要權(quán)衡使用。
六、與工廠方法模式的區(qū)別
上一節(jié)有介紹了工廠方法模式,那么他們的區(qū)別是什么?抽象工廠模式是工廠方法模式的升級(jí)版本。對比如下:
工廠方法模式 | 抽象工廠模式 |
---|---|
只有一個(gè)抽象產(chǎn)品類 | 有多個(gè)抽象產(chǎn)品類 |
具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例 | 抽象工廠類能創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例 |
七、源碼中的實(shí)現(xiàn)
抽象工廠模式在Android源碼中使用較少,因?yàn)楹苌贂?huì)出現(xiàn)多個(gè)產(chǎn)品種類的情況,大部分使用工廠方法模式即可解決。
MediaPlayer
MediaPlayer Factory分別會(huì)生成4個(gè)不同的MediaPlayer基類:StagefrightPlayer、NuPlayerDriver、MidiFile和TestPlayerStub,四者均繼承于MediaPlayerBase。
八、總結(jié)
優(yōu)點(diǎn):
分離接口與實(shí)現(xiàn),客戶端使用抽象工廠來創(chuàng)建需要的對象,而客戶端根本就不知道具體的實(shí)現(xiàn)是誰,客戶端只是面向產(chǎn)品的接口編程而已,使其從具體的產(chǎn)品實(shí)現(xiàn)中解耦,同時(shí)基于接口與實(shí)現(xiàn)分離,使抽象該工廠方法模式在切換產(chǎn)品類時(shí)更加靈活、容易。
缺點(diǎn):
一是對類文件的爆炸性增加
二是不太容易擴(kuò)展新的產(chǎn)品類
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- 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ì)模式之中介者模式詳解
相關(guān)文章
解析android中隱藏與顯示軟鍵盤及不自動(dòng)彈出鍵盤的實(shí)現(xiàn)方法
本篇文章對android中隱藏與顯示軟鍵盤以及不自動(dòng)彈出鍵盤的方法進(jìn)行了分析介紹。需要的朋友參考下2013-05-05Android TextView和ImageView簡單說明
Android TextView和ImageView簡單說明,需要的朋友可以參考一下2013-03-03Android實(shí)現(xiàn)倒計(jì)時(shí)的方案梳理
這篇文章主要介紹了Android實(shí)現(xiàn)倒計(jì)時(shí)的方案梳理,下面文章圍繞主題展開Android倒計(jì)時(shí)方案,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Android實(shí)現(xiàn)控件拖動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)控件拖動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Android ActivityManagerService啟動(dòng)流程詳解
這篇文章主要介紹了Android ActivityManagerService啟動(dòng)流程,AMS,即ActivityManagerService,是安卓java framework的一個(gè)服務(wù),運(yùn)行在system_server進(jìn)程。此服務(wù)十分重要,因?yàn)樗芾碇沧康乃拇蠼M件,是安卓APP開發(fā)者最常接觸到的一個(gè)服務(wù)2023-02-02Android?14新功能HighLights快速實(shí)現(xiàn)文本高亮
這篇文章主要為大家介紹了Android?14新功能HighLights快速實(shí)現(xiàn)文本高亮示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android編程實(shí)現(xiàn)夜間模式的方法小結(jié)
這篇文章主要介紹了Android編程實(shí)現(xiàn)夜間模式的方法,涉及Android亮度調(diào)節(jié)、自定義Theme、遮罩模式等相關(guān)使用技巧,需要的朋友可以參考下2018-01-01Android優(yōu)化方案之Fragment的懶加載實(shí)現(xiàn)代碼
本篇文章主要介紹了Android優(yōu)化方案之Fragment的懶加載實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03android配合viewpager實(shí)現(xiàn)可滑動(dòng)的標(biāo)簽欄示例分享
本文主要介紹了android實(shí)現(xiàn)可滑動(dòng)的標(biāo)簽欄示例,配合viewpager作為標(biāo)簽欄,且可以設(shè)置每頁顯示的標(biāo)簽個(gè)數(shù),超出可滑動(dòng)顯示,需要的朋友可以參考下2014-02-02Kotlin數(shù)據(jù)存儲(chǔ)方式全面總結(jié)講解
在開發(fā)過程中,數(shù)據(jù)存取是較為頻繁的,今天我們來了解下android幾種常見的數(shù)據(jù)存取方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-12-12