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。
抽象工廠模式的優點:
一個顯著的優點是分離介面 與 實現,客戶端使用抽象工廠來建立需要的物件,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的介面程式設計而已,使其從具體的產品實現中解耦,同時基於介面與實現的分離,使抽象工廠方法模式在切換產品種類時更加靈活、容易。
抽象工廠模式的缺點:
上面我們也有所提及,一是類檔案的爆炸性增加,二是不太容易擴充套件新的產品類,因為每當我們增加一個產品類就需要修改其抽象工廠,那麼所有的具體工廠類均會被修改。
抽象工廠方法模式在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,都可以看做是一個具體的工廠。這樣來看相對於一個抽象工廠方法模式的雛形也沒有錯。