天天看點

Android設計模式之抽象工廠

抽象工廠模式的定義

為建立一組相關或者是互相依賴的對象提供一個接口,而不需要指定它們的具體類。

抽象工廠的使用場景

一個對象族有相同的限制時可以使用抽象工廠模式。舉個例子:

Android、ios、window phone下都有短信軟體和撥号軟體,兩者都屬于軟體的範疇,但是它們所在的作業系統平台不一樣,即便是同一家公司出品的軟體,其代碼的實作邏輯也是不同的,這時候就考慮使用抽象工廠方法模式來生産Android、ios、Window phone下的短信軟體和撥号軟體。

抽象工廠模式的類比較多,但是,主要分為四類:

1.AbstractFactory:抽象工廠角色, 它聲明了一組用于建立一種産品的方法,每一種方法對應一種産品,如上述類圖的AbsttractFactory中就定義了兩個方法,分别建立産品A和産品B。

2.ConcreteFactory:具體工廠角色,它實作了在抽象工廠中定義的建立産品的方法,生成一組具體産品,這些産品構成了一個産品種類,每一個産品都位于某一個産品等級結構中,如上述類圖的ConcreteFactory1和Concretefactory2。

3.AbstractProduct:抽象産品角色,他為每種産品聲明接口,比如上述類圖中的AbstratctProductA、AbstractProductB。

4.ConcreteProduct:具體産品角色,它定義具體工廠生産的具體産品對象,實作抽象産品接口中聲明的業務方法,如上述類圖中的ConcreteProductA1、ConcreteProductA2、ConcreteProductB1、ConcreteProductB2。

抽象工廠方法模式的UML類圖:

Android設計模式之抽象工廠

抽象工廠模式的優點:

一個顯著的優點是分離接口 與 實作,用戶端使用抽象工廠來建立需要的對象,而用戶端根本就不知道具體的實作是誰,用戶端隻是面向産品的接口程式設計而已,使其從具體的産品實作中解耦,同時基于接口與實作的分離,使抽象工廠方法模式在切換産品種類時更加靈活、容易。

抽象工廠模式的缺點:

上面我們也有所提及,一是類檔案的爆炸性增加,二是不太容易擴充新的産品類,因為每當我們增加一個産品類就需要修改其抽象工廠,那麼所有的具體工廠類均會被修改。

抽象工廠方法模式在Android源碼中實作相對來說比較少,我們說過Activity的onCreate方法其實就相當于一個工廠方法。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new LinearLayout(this));

}
           

同樣,對于另外一個元件Service來說,其onBind方法也可以看做是一個工廠方法。

public class BaseService extends Service {

@Nullable

@Override

public IBinder onBind(Intent intent) {

return new Binder();

}

}
           

如果從framework的角度來看Activity和Service,都可以看做是一個具體的工廠。這樣來看相對于一個抽象工廠方法模式的雛形也沒有錯。

參考《Android源碼設計模式》