1. 程式人生 > >抽象工廠模式(c++實現)

抽象工廠模式(c++實現)

# 抽象工廠模式 [TOC] ## 模式定義 **抽象工廠模式(Abstract Factory)**,提供一個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類。 ## 模式動機 - 通常是在執行時刻在建立一個ConcreteFactory類的例項,這個具體的工廠再建立具有特定實現的產品物件,也就是說,為建立不同的產品物件,客戶端應使用不同的具體工廠。 ## UML類圖 ![](https://files-cdn.cnblogs.com/files/wzxNote/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F.bmp) ## 原始碼實現 - abstractproducta.h ```c++ #include class AbstracProductA { public: AbstracProductA(); virtual ~AbstracProductA(); void Show(); virtual std::string Name(); }; class ConcreteProductA1 : public AbstracProductA { public: ConcreteProductA1(); std::string Name() override; }; class ConcreteProductA2 : public AbstracProductA { public: ConcreteProductA2(); std::string Name() override; }; ``` - abstractfactory.h ```c++ #include "abstracproducta.h" #include "abstracproductb.h" class AbstractFactory { public: AbstractFactory(); virtual ~AbstractFactory(); virtual AbstracProductA* CreateProductA() = 0; virtual AbstracProductB* CreateProductB() = 0; }; class ConcreteFactory1 : public AbstractFactory { public: ConcreteFactory1(); AbstracProductA* CreateProductA() override; AbstracProductB* CreateProductB() override; }; class ConcreteFactory2 : public AbstractFactory { public: ConcreteFactory2(); AbstracProductA* CreateProductA() override; AbstracProductB* CreateProductB() override; }; ``` - main.cpp ```c++ #include #include "abstractfactory.h" #include "abstracproducta.h" #include "abstracproductb.h" using namespace std; int main() { AbstractFactory* factory1 = new ConcreteFactory1(); AbstracProductA* pA1 = factory1->CreateProductA(); AbstracProductB* pB1 =factory1->CreateProductB(); pA1->Show(); pB1->Show(); AbstractFactory* factory2 = new ConcreteFactory2(); AbstracProductA* pA2 = factory2->CreateProductA(); AbstracProductB* pB2 =factory2->CreateProductB(); pA2->Show(); pB2->Show(); return 0; } ``` - 執行結果 > ## 優點 抽象工廠模式的優點 - 好處是易於交換產品系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得該百年一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。 - 它讓具體的建立例項過程與客戶端分離,客戶端是通過它們的抽象介面操縱例項,產品的具體類名也被具體工廠的實現分離,不會出現在客戶程式碼中。 ## 缺點 模式的缺點 - 所有在用簡單工廠的地方,都可以考慮用反射技術來去除switch或if,接觸分支判斷帶來的耦合。 ### 感悟 一個程式設計師如果從來沒有熬夜寫程式的經歷,不能算是一個好程式猿,因為他沒有痴迷過,所以他不會有大