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

抽象工廠模式

模式定義

抽象工廠模式(Abstract Factory),提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。

模式動機

  • 通常是在運行時刻在創建一個ConcreteFactory類的實例,這個具體的工廠再創建具有特定實現的產品對象,也就是說,爲創建不同的產品對象,客戶端應使用不同的具體工廠。

UML類圖

源碼實現

  • abstractproducta.h
#include <string>

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
#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
#include <iostream>
#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,接觸分支判斷帶來的耦合。

感悟

一個程序員如果從來沒有熬夜寫程序的經歷,不能算是一個好程序猿,因爲他沒有癡迷過,所以他不會有大成就。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章