設計模式之工廠模式

工廠模式大致可以分爲三類:
1、簡單工廠模式
2、工廠方法模式
3、抽象工廠模式。
這三種模式逐步抽象,並且更具有一般性。
工廠模式有一種非常形象的描述,建立對象的類就像一個工廠,而需要被建立的對象就是一個個產品,在工廠中加工產品,使用產品的人不用關心產品是如何生產出來的。在軟件中使用工廠模式的好處就是降低了模塊之間的耦合。設計模式的實現是基於C++多態來實現的。

簡單工廠模式

一、簡單工廠模式:
簡單工廠模式是工廠模式中最簡單的一種,他可以用比較簡單的方式隱藏創建對象的細節,一般只需要告訴工廠類所需要的產品類型,工廠類就會返回需要的產品對象。
例:現在有一個工廠生產A,B兩種類型的產品。使用工廠模式設計就是有一個工廠類Factory,可以根據輸入的類型(typeA,typeB)從而創建相應的A類型對象,B類型對象。

enum{ typeA, typeB };

class product{
public:
    virtual void show() = 0;
};

class productA : public product{
public:
    virtual void show(){
        cout<< "productA" << endl;
    }
};

class productB : public product{
public:
    virtual void show(){
        cout<< "productB" << endl;
    }
};

class Factory{
public:
    static product* createproduct(int type){
        switch(type){
        case typeA:
            return new productA();
            break;
        case typeB:
            return new productB();
            break;
        }
    }
};

int main()
{
    Factory f;
    product* pA = f.createproduct(typeA);
    product* pB = f.createproduct(typeB);
    pA->show();
    pB->show();
    return 0;
}

簡單工廠模式的話統一了創建對象的接口,隱藏了創建對象的細節,只要知道產品的類型就可以創建出產品對象。

但是簡單工廠模式不易對產品進行擴展,比如現在又出來了一種C類型的產品,那要修改的地方就很多了,首先要添加一個C類型的產品類,還有在工廠類中再添加一個分支,這違背了開閉原則。
所以簡單工廠模式適用於產品子類不多的場合

工廠方法模式

由於簡單工廠模式違反了開閉原則,所以工廠方法模式的出現了,工廠方法模式是在簡單工廠模式的基礎上,對”工廠”添加了一個抽象層,將工廠的動作抽象出來,作爲抽象類,而具體的行爲由工廠類的子類去實現,讓工廠類的子類決定去生產什麼類型的產品。

工廠方法模式與簡單工廠模式不同的是,簡單工廠模式是將判斷創造哪一個“產品”的邏輯交給工廠類的內部。而工廠方法模式是將要創造哪個對象交給用戶。

工廠方法模式提供了一個抽象的工廠類接口,而具體的生產則是放到工廠類的子類當中,這樣進一步抽象使得以後再增加新的產品的時候非常簡單,不必修改原有代碼,只需要增加一個新的工廠子類就可以了。

class product{
public:
    virtual void show() = 0;
};

class productA: public product{
public:
    virtual void show(){
        cout<< "productA"<<endl;
    }
};

class productB: public product{
public:
    virtual void show(){
        cout<<"productB"<<endl;
    }
};

class Factory{
public:
    virtual product* createproduct() = 0;
};

class FactoryA: public Factory{
public:
    virtual product* createproduct(){
        return new productA();
    }
};

class FactoryB: public Factory{
public:
    virtual product* createproduct(){
        return new productB();
    }
};

int main()
{
    Factory* pFA = new FactoryA();
    Factory* pFB = new FactoryB();
    pFA->createproduct()->show();
    pFB->createproduct()->show();
    return 0;
}

三、抽象工廠模式:
工廠方法模式和簡單工廠模式都適用於”產品種類結構單一”的場合,爲一類產品提供創建的接口。
例如生產鋼筆的工廠只生產鋼筆這一類產品,如果使用工廠方法模式的話,則這個工廠就不能同時生產鉛筆。
如果想讓生產鋼筆的工廠同時生產鉛筆的話,則可以使用抽象工廠模式。
抽象工廠模式使用與產品種類結構多的場合(比如A工廠裏面既有高檔鋼筆也有高檔鉛筆),主要用於創建一組相關的產品,爲他們提供創建的接口。

class pen{
public:
    virtual void show() = 0;
};

class pen1 :public pen{
public:
    virtual void show(){
        cout<< "good pen"<<endl;
    }
};

class pen2 :public pen{
public:
    virtual void show(){
        cout<< "bad pen"<<endl;
    }
}; 

class pencil{
public:
    virtual void show() = 0;
};

class pencil1 :public pencil{
public:
    virtual void show(){
        cout<<"good pencil"<<endl;
    }
};

class pencil2 :public pencil{
public:
    virtual void show(){
        cout<<"bad pencil"<<endl;
    }
};

class Factory{
public:
    virtual pen* createpen() = 0;
    virtual pencil* createpencil() = 0;
};

class Factory1 : public Factory{
public:
    virtual pen* createpen(){
        return new pen1();
    }
    virtual pencil* createpencil(){
        return new pencil1();
    }
};

class Factory2 : public Factory{
public:
    virtual pen* createpen(){
        return new pen2();
    }
    virtual pencil* createpencil(){
        return new pencil2();
    }
};

int main()
{
    Factory* f1 = new Factory1();
    f1->createpen()->show();
    f1->createpencil()->show();

    Factory* f2 = new Factory2();
    f2->createpen()->show();
    f2->createpencil()->show();
    return 0;
}

抽象工廠模式封裝了產品的創建,只要我們知道工廠就可以創建出一組產品。但是缺點也很明顯,比如新增一個產品,要在每個工廠中再添加一種方法,違反了開閉原則。

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