由淺入深工廠模式

[TOC]

工廠模式

簡單工廠模式

用一個單獨的類來做創造實例的過程,就是簡單工廠

#include <iostream>
using namespace std;

class AbstractProduct {
public:
    virtual ~AbstractProduct() {} 
    virtual void Operation() = 0;
};

class ProductA : public AbstractProduct {
public:
    void Operation() { cout << "ProductA" << endl; }
};

class ProductB : public AbstractProduct {
public:
    void Operation() { cout << "ProductB" << endl; }
};

class Factory {
public:
    AbstractProduct* createProduct(char product) {
        AbstractProduct* ap = NULL;
        switch(product) {
            case 'A': ap = new ProductA(); break;
            case 'B': ap = new ProductB(); break;
        }
        return ap;
    }
};

int main() {
    Factory* f = new Factory();
    AbstractProduct* apa = f->createProduct('A');
    apa->Operation();  // ProductA

    AbstractProduct* apb = f->createProduct('B');
    apb->Operation();  // ProductB

    delete apa;
    delete apb;
    delete f;

    return 0;
}

缺點:

不符合開閉原則

工廠方法模式

工廠方法模式定義了一個用于創建對象的接口,讓子類決定實例化哪一個類

#include <iostream>
using namespace std;

class AbstractProduct
{
public:
    virtual ~AbstractProduct(){}
    virtual void Operation() = 0;
};

class ProductA : public AbstractProduct
{
public:
    void Operation() {cout << "ProductA" << endl;};
};

class ProductB : public AbstractProduct
{
public:
    void Operation() {cout << "ProductB" << endl;};
};

class AbstractFactory
{
public:
    virtual ~AbstractFactory() {}
    virtual AbstractProduct* FactoryMethod() = 0;
};

class FactoryA : public AbstractFactory
{
public:
    ~FactoryA() {}
    ProductA* FactoryMethod(){
        return new ProductA();
    }
};

class FactoryB : public AbstractFactory
{
public:
    ~FactoryB() {}
    ProductB* FactoryMethod(){
        return new ProductB();
    }
};

int main(int argc, const char** argv) {
    AbstractFactory* fa = new FactoryA();
    AbstractProduct* a = fa->FactoryMethod();
    a->Operation();

    AbstractFactory* fb = new FactoryB();
    AbstractProduct* b = fb->FactoryMethod();
    b->Operation();

    delete a;
    delete b;
    delete fa;
    delete fb;

    return 0;
}

抽象工廠模式

抽象工廠模式是工廠方法的進一步深化,在這個模式中,工廠類不單單可以創建一個對象,而是可以創建一組對象。

AbstractFactory(抽象工廠)聲明了一組用于創建對象的方法,注意是一組。
ConcreteFactory(具體工廠):它實現了在抽象工廠中聲明的創建對象的方法,生成一組具體對象。
AbstractProduct(抽象產品):它為每種對象聲明接口,在其中聲明了對象所具有的業務方法。
ConcreteProduct(具體產品):它定義具體工廠生產的具體對象。

#include <iostream>
using namespace std;

class AbstractProductA {
public:
    virtual ~AbstractProductA(){}
    virtual void Operation() = 0;
};

class ProductA1 : public AbstractProductA {
public:
    void Operation() {
        cout << "ProductA1" << endl;
    }
};

class ProductA2 : public AbstractProductA {
public:
    void Operation() {
        cout << "ProductA2" << endl;
    }
};

class AbstractProductB {
public:
    virtual ~AbstractProductB(){}
    virtual void Operation() = 0;
};

class ProductB1 : public AbstractProductB {
public:
    void Operation() {
        cout << "ProductB1" << endl;
    }
};

class ProductB2 : public AbstractProductB {
public:
    void Operation() {
        cout << "ProductB2" << endl;
    }
};


class AbstractFactory {
public:
    virtual AbstractProductA* CreateProductA() = 0;
    virtual AbstractProductB* CreateProductB() = 0;
    virtual ~AbstractFactory(){}
};

class ConcreteFactory1 : public AbstractFactory {
public:
    ProductA1* CreateProductA() {
        return new ProductA1();
    }
    ProductB1* CreateProductB() {
        return new ProductB1();
    }
};

class ConcreteFactory2 : public AbstractFactory {
public:
    ProductA2* CreateProductA() {
        return new ProductA2();
    }
    ProductB2* CreateProductB() {
        return new ProductB2();
    }
};

int main() {
    AbstractFactory* af1 = new ConcreteFactory1();
    // 具體工廠創建對應的具體產品
    AbstractProductA* apa1 = af1->CreateProductA();  // 工廠1創建產品A
    apa1->Operation();  // ProductA1

    AbstractProductB* apb1 = af1->CreateProductB();  // 工廠1創建產品B
    apb1->Operation();  // ProductB1

    AbstractFactory* af2 = new ConcreteFactory2();
    AbstractProductA* apa2 = af2->CreateProductA();  // 工廠2創建產品A
    apa2->Operation();  // ProductA2

    AbstractProductB* apb2 = af2->CreateProductB();  // 工廠2創建產品B
    apb2->Operation();  // ProductB2

    delete apa1;
    delete apa2;
    delete af1;
    delete apb1;
    delete apb2;
    delete af2;
    return 0;
}

對象工廠

當系統中抽象基類中有很多具體子類,采用上述方式擴展成本極高。函數指針通過引入一個從type到函數指針的索引,使得程序實現非常優雅。


參考文章:

  1. 工廠模式C++
  2. 對象工廠(1)---和萬惡的 switch 說再見
  3. 對象工廠(2)---一個泛化的工廠類
  4. 《Modern C++ Design》(C++設計新思維)源碼下載
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。通常我們所說的工廠模式是指工廠方法模...
    zfylin閱讀 1,332評論 0 7
  • 工廠方法模式通過引入工廠等級結構,解決了簡單工廠模式中工廠類職責太重的問題,但由于工廠方法模式中的每個工廠只生產一...
    justCode_閱讀 1,218評論 1 6
  • 文/羅桑 今天突然興起,打算收拾一下那些閑置的書籍。然后,那個由塑膠封面包裹著的語文錯題集便闖入了我的視野。 那枝...
    初學者羅桑閱讀 346評論 0 1
  • 拿著一天的收入 走在街上 天色已晚,繁星點綴 呼吸著自由的空氣 買了塊餅填肚子 加了培根和蔬菜 再帶上一瓶水 吃不...
    凌晨有點藍閱讀 193評論 0 3
  • 現在市面上充斥著各種措辭夸張吸引眼球的成功學書籍,但是內容大多是乏善可陳,只見口號雞湯卻不見有意義的觀點。然而今天...
    功在十駕閱讀 349評論 0 2