【設計模式攻略】建立型模式之Abstract Factory模式
阿新 • • 發佈:2019-02-05
概要
Abstract factory模式其實就是普通factory模式的一種進化,它比較側重於對一個系列中相關多個物件的建立工作。何謂一個系列?其實就是某種客觀條件下滿足特定需求的一組物件集合。當面對多個系列時,需要實現每個系列的例項化的Factory,這時使用一般的Factory模式往往讓過程變得複雜,而Abstract
factory模式則可以解決這類問題。
目的
Abstract factory模式可以提供統一的介面來建立一個系列的相關物件,而不需要顯式的去指定每種物件型別。
例項
讓我們來考慮一個實際的例子,假設我們有兩款功放產品,每種功放有輸入和輸出兩組module,我們要如何為這些module的例項化設計出一個可行又有效的方法?用Abstract factory就可以達到這個目的,考慮如下的類圖:
AbstractFactory類定義了一組建立功放輸入和輸出module的介面,具體的Factory類AmplifierFactory1和AmplifierFactory2負責具體功放的建立工作,Client可以通過AbstractFactory提供的介面來獲得相應功放的輸入輸出物件。 程式碼的一般實現如下:
應用
現在應該能更容易理解,Abstract Factory模式更適用於提供統一的介面來建立一個系列的物件,如上例子中,所謂的一個系列就是一種功放的輸入和輸出模組。從介面的定義可以看出,使用者只需要依賴抽象層的物件,而未耦合於具體實現,讓物件的例項化和訪問使用更加方便,當然具體使用的時候也有一點麻煩的地方,當功放還需要一種新的功能時,必須增加AbstractFactory的抽象介面和新增具體的實現,可以說是增加了一些額外的工作量。
AbstractFactory類定義了一組建立功放輸入和輸出module的介面,具體的Factory類AmplifierFactory1和AmplifierFactory2負責具體功放的建立工作,Client可以通過AbstractFactory提供的介面來獲得相應功放的輸入輸出物件。 程式碼的一般實現如下:
可以通過相應的Factory類來建立相應的功放物件:class AbstractAmplifierIn {}; class AbstractAmplifierOut {}; class Amplifer1_In : public AbstractAmplifierIn {}; class Amplifer2_In : public AbstractAmplifierIn {}; class Amplifer1_Out : public AbstractAmplifierOut {}; class Amplifer2_Out : public AbstractAmplifierOut {}; class AbstractFactory { public: virtual AbstractAmplifierIn* create_amplifier_in() = 0; virtual AbstractAmplifierOut* create_amplifier_out() = 0; }; class AmplifierFactory1 : public AbstractFactory { public: AbstractAmplifierIn* create_amplifier_in() { return new Amplifer1_In; } AbstractAmplifierOut* create_amplifier_out() { return new Amplifer1_Out; } }; class AmplifierFactory2 : public AbstractFactory { public: AbstractAmplifierIn* create_amplifier_in() { return new Amplifer2_In; } AbstractAmplifierOut* create_amplifier_out() { return new Amplifer2_Out; } };
AbstractFactory* factory = new AmplifierFactory1;
AbstractAmplifierIn* amp_in = factory->create_amplifier_in();
AbstractAmplifierOut* amp_out = factory->create_amplifier_out();
另外,也可以與之前Factory模式一文中提出的一樣,用map來註冊和管理所有的工廠類物件,通過查詢map來獲得factory物件進而例項化相關物件,同時在AbstractFactory類中結合使用Singleton模式可以讓例項化介面和使用更方便和統一。具體請參考: