1. 程式人生 > >【設計模式攻略】建立型模式之Abstract Factory模式

【設計模式攻略】建立型模式之Abstract Factory模式

概要 Abstract factory模式其實就是普通factory模式的一種進化,它比較側重於對一個系列中相關多個物件的建立工作。何謂一個系列?其實就是某種客觀條件下滿足特定需求的一組物件集合。當面對多個系列時,需要實現每個系列的例項化的Factory,這時使用一般的Factory模式往往讓過程變得複雜,而Abstract factory模式則可以解決這類問題。 目的 Abstract factory模式可以提供統一的介面來建立一個系列的相關物件,而不需要顯式的去指定每種物件型別。 例項 讓我們來考慮一個實際的例子,假設我們有兩款功放產品,每種功放有輸入和輸出兩組module,我們要如何為這些module的例項化設計出一個可行又有效的方法?用Abstract factory就可以達到這個目的,考慮如下的類圖:

AbstractFactory類定義了一組建立功放輸入和輸出module的介面,具體的Factory類AmplifierFactory1和AmplifierFactory2負責具體功放的建立工作,Client可以通過AbstractFactory提供的介面來獲得相應功放的輸入輸出物件。 程式碼的一般實現如下:
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;
     }
};
可以通過相應的Factory類來建立相應的功放物件:
AbstractFactory* factory = new AmplifierFactory1;
AbstractAmplifierIn* amp_in = factory->create_amplifier_in();
AbstractAmplifierOut* amp_out = factory->create_amplifier_out();
另外,也可以與之前Factory模式一文中提出的一樣,用map來註冊和管理所有的工廠類物件,通過查詢map來獲得factory物件進而例項化相關物件,同時在AbstractFactory類中結合使用Singleton模式可以讓例項化介面和使用更方便和統一。具體請參考:
應用 現在應該能更容易理解,Abstract Factory模式更適用於提供統一的介面來建立一個系列的物件,如上例子中,所謂的一個系列就是一種功放的輸入和輸出模組。從介面的定義可以看出,使用者只需要依賴抽象層的物件,而未耦合於具體實現,讓物件的例項化和訪問使用更加方便,當然具體使用的時候也有一點麻煩的地方,當功放還需要一種新的功能時,必須增加AbstractFactory的抽象介面和新增具體的實現,可以說是增加了一些額外的工作量。