本文實例講述了Android編程設計模式之抽象工廠模式。分享給大家供大家參考,具體如下:
一、介紹
抽象工廠模式(Abstract Factory Pattern),也是創建型設計模式之一。前一節我們已經了解了工廠方法模式,那么這個抽象工廠又是怎么一回事呢?大家聯想一下現實生活中的工廠肯定都是具體的,也就是說每個工廠都會生產某一種具體的產品,那么抽象工廠意味著生產出來的產品是不確定的,那這豈不是很奇怪?抽象工廠模式起源于以前對不同操作系統的圖形化解決方案,如不同操作系統中的按鈕和文本框控件其實現不同,展示效果也不一樣,對于每一個操作系統,其本身就構成一個產品類,而按鈕與文本框控件也構成一個產品類,兩種產品類兩種變化,各自有自己的特性,如Android中的Button和TextView,iOS中的Button和TextView,Window Phone中的Button和TextView等。
二、定義
為創建一組相關或者是相互依賴的對象提供一個接口,而不需要指定它們的具體類。
三、使用場景
一個對象族有相同的約束時可以使用抽象工廠模式。是不是聽起來很抽象?舉個例子,Android、iOS、Window Phone下都有短信軟件和撥號軟件,兩者都屬于Software軟件的范疇,但是,它們所在的操作系統平臺不一樣,即便是同一家公司出品的軟件,其代碼的實現邏輯也是不一樣的,這時候就可以考慮使用抽象工廠方法模式來產生Android、iOS、Window Phone下的短信軟件和撥號軟件。
四、抽象工廠模式的UML類圖
UML類圖:

雖然抽象工廠方法模式的種類繁多,但是,主要還是分為4類:
AbstractFactory:抽象工廠角色,它聲明了一組用于創建一種產品的方法,每一個方法對應一種產品。
ConcreteFactory:具體的工廠角色,它實現了在抽象工廠中定義的創建產品的方法,生成一組具體產品,這些產品構成了一個產品種類,每一個產品都位于某個產品等級結構中。
AbstractProduct:抽象產品角色,它為每種產品聲明接口。
ConcreteProduct:具體產品角色,它定義具體工廠生產的具體產品對象,實現抽象產品接口中聲明的業務方法。
五、簡單實現
以車廠生產汽車零部件為例,A、B兩家車廠分別生產不同的輪胎、發動機、制動系統。雖然生產的零件不同,型號不同。但是根本上都有共同的約束,就是輪胎、發動機、制動系統。
輪胎相關類:
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("越野輪胎"); }}發動機相關類:
public interface IEngine { /** *發動機 */ void engine();}public class DomesticEngine implements IEngine{ @Override public void engine() { System.out.println("國產發動機"); }}public class ImportEngine implements IEngine{ @Override public void engine() { System.out.println("進口發動機"); }}制動系統相關類:
public interface IBrake { /** *制動系統 */ void brake();}public class NormalBrake implements IBrake{ @Override public void brake() { System.out.println("普通制動"); }}public class SeniorBrake implements IBrake{ @Override public void brake() { System.out.println("高級制動"); }}抽象車廠類:
public abstract class CarFactory { /** * 生產輪胎 * * @return 輪胎 * */ public abstract ITire createTire(); /** * 生產發動機 * * @return 發動機 * */ public abstract IEngine createEngine(); /** * 生產制動系統 * * @return 制動系統 * */ 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(); }}結果:
普通輪胎國產發動機普通制動------------------越野輪胎進口發動機高級制動
可以看出上面模擬了兩個車廠,如果有了C廠、D廠,各自廠家生產的零部件型號種類又不相同,那么我們創建的類文件就會翻倍。這也是抽象工廠模式的一個弊端,所以實際開發中要權衡使用。
六、與工廠方法模式的區別
上一節有介紹了工廠方法模式,那么他們的區別是什么?抽象工廠模式是工廠方法模式的升級版本。對比如下:
| 工廠方法模式 | 抽象工廠模式 |
|---|---|
| 只有一個抽象產品類 | 有多個抽象產品類 |
| 具體工廠類只能創建一個具體產品類的實例 | 抽象工廠類能創建多個具體產品類的實例 |
七、源碼中的實現
抽象工廠模式在Android源碼中使用較少,因為很少會出現多個產品種類的情況,大部分使用工廠方法模式即可解決。
MediaPlayer
MediaPlayer Factory分別會生成4個不同的MediaPlayer基類:StagefrightPlayer、NuPlayerDriver、MidiFile和TestPlayerStub,四者均繼承于MediaPlayerBase。
八、總結
優點:
分離接口與實現,客戶端使用抽象工廠來創建需要的對象,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的接口編程而已,使其從具體的產品實現中解耦,同時基于接口與實現分離,使抽象該工廠方法模式在切換產品類時更加靈活、容易。
缺點:
一是對類文件的爆炸性增加
二是不太容易擴展新的產品類
希望本文所述對大家Android程序設計有所幫助。
新聞熱點
疑難解答