国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程設計模式之抽象工廠模式詳解

2019-10-22 18:18:59
字體:
來源:轉載
供稿:網友

本文實例講述了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類圖:

Android,抽象工廠模式,設計模式

雖然抽象工廠方法模式的種類繁多,但是,主要還是分為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程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赤城县| 太和县| 铜鼓县| 师宗县| 陇川县| 中西区| 大邑县| 甘肃省| 长岭县| 关岭| 嘉善县| 井研县| 屏山县| 瑞安市| 迁安市| 富宁县| 青阳县| 科尔| 泽库县| 淮安市| 天水市| 沈阳市| 醴陵市| 安达市| 威远县| 会同县| 井研县| 汝城县| 灵台县| 中卫市| 大冶市| 安顺市| 安化县| 滦平县| 夹江县| 高陵县| 新竹县| 宣汉县| 榆林市| 武山县| 凌云县|