工廠模式(C++實現)


  沒事搗鼓了下相對而言比較簡單的工廠模式,然后寫了個小Demo,記錄下,等十年后看到也是種回憶哈.......

  工廠模式一般分為三種:簡單工廠模式、工廠方法模式、抽象工廠模式。

一、簡單工廠模式:

  簡單工廠模式,工廠類是創建產品的,它決定創建哪一種產品,就像領導決定采用那種技術方案樣。舉個例子,現在有寶馬車和奔馳車兩種車需要生產,但是只有一個工廠,且只能在同一時間生產一種車,這時就有工廠決定生產那種車了。例子雖然不是十分恰當,但是會其意即可。我們直接看UML類圖和代碼吧。

看代碼就一目了然了:

#include <iostream>
using namespace std;

enum CarType{BENZ, BMW};

class Car//車類
{
public:
    virtual void createdCar(void) = 0;
};

class BenzCar : public Car //奔馳車
{
public:
    BenzCar()
    {
        cout<<"Benz::Benz()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"BenzCar::createdCar()"<<endl;
    }
    ~BenzCar()
    {

    }
};

class BmwCar : public Car //寶馬車
{
public:
    BmwCar()
    {
        cout<<"Bmw::Bmw()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"BmwCar::createdCar()"<<endl;
    }
};


class CarFactory //車廠
{
public:
    Car* createSpecificCar(CarType type)
    {
        switch(type)
        {
        case BENZ://生產奔馳車
            return (new BenzCar());
            break;
        case BMW://生辰寶馬車
            return (new BmwCar());
            break;
        default:
            return NULL;
            break;
        }
    }
};

int main(int argc, char** argv)
{
    CarFactory carfac;
    Car* specificCarA = carfac.createSpecificCar(BENZ);//看到網上眾多示例在new后沒有delete,感覺不是特別嚴謹
    Car* specificCarB = carfac.createSpecificCar(BMW);

    delete specificCarA; delete specificCarB;
    
    return 0;
}

輸出結果如下:

  簡單工廠模式在每次增加新的車型時,需要修改工廠類,這就違反了開放封閉原則:軟件實體(類、模塊、函數)可以擴展,但是不可修改。於是,工廠方法模式出現了。

二、工廠方法模式:

  工廠方法模式:不再只由一個工廠類決定那一個產品類應當被實例化,這個決定權被交給子類去做。當有新的產品(新型汽車)產生時,只要按照抽象產品角色、抽象工廠角色提供的方法來生成即可(新車型可以用一個新類繼承創建產品即可),那么就可以被客戶使用,而不必去修改任何已有的代 碼。可以看出工廠角色的結構也是符合開閉原則。如下面UML類圖:

代碼如下:

#include <iostream>
using namespace std;

class Car//車類
{
public:
    virtual void createdCar(void) = 0;
};

class BenzCar : public Car //奔馳車
{
public:
    BenzCar()
    {
        cout<<"Benz::Benz()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"BenzCar::createdCar()"<<endl;
    }
    ~BenzCar()
    {

    }
};

class BmwCar : public Car //寶馬車
{
public:
    BmwCar()
    {
        cout<<"Bmw::Bmw()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"BmwCar::createdCar()"<<endl;
    }
};


class Factory//車廠
{
public:
    virtual Car* createSpecificCar(void) = 0;
};

class BenzFactory : public Factory//奔馳車廠
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BenzCar());
    }
};

class BmwFactory : public Factory//寶馬車廠
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BmwCar());
    }
};


int main(int argc, char** argv)
{
    Factory* factory = new BenzFactory();
    Car* specificCarA = factory->createSpecificCar();
    factory = new BmwFactory();
    Car* specificCarB = factory->createSpecificCar();
    
    delete factory; delete specificCarA; delete specificCarB;
    
    return 0;
}

三、抽象工廠:

  在上面的工廠方法模式基礎上,有需要生產高配版的奔馳和寶馬,那工廠方法模式就有點鞭長莫及了,這就又有抽象工廠模式,UML類圖如下:

代碼如下:

#include <iostream>
using namespace std;

class Car//車類
{
public:
    virtual void createdCar(void) = 0;
};

class BenzCar : public Car //奔馳車
{
public:
    BenzCar()
    {
        cout<<"Benz::Benz()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"BenzCar::createdCar()"<<endl;
    }
    ~BenzCar()
    {

    }
};

class BmwCar : public Car //寶馬車
{
public:
    BmwCar()
    {
        cout<<"Bmw::Bmw()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"BmwCar::createdCar()"<<endl;
    }
};

class HighCar //高配版車型
{
public:
    virtual void createdCar(void) = 0;
};

class HighBenzCar : public HighCar //高配奔馳車
{
public:
    HighBenzCar()
    {
        cout<<"HighBenzCarBenz::Benz()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"HighBenzCar::createdCar()"<<endl;
    }
};

class HighBmwCar : public HighCar //高配寶馬車
{
public:
    HighBmwCar()
    {
        cout<<"HighBmwCar::Bmw()"<<endl;
    }
    virtual void createdCar(void)
    {
        cout<<"HighBmwCar::createdCar()"<<endl;
    }
};

class Factory//車廠
{
public:
    virtual Car* createSpecificCar(void) = 0;
    virtual HighCar* createdSpecificHighCar(void) = 0;
};

class BenzFactory : public Factory//奔馳車廠
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BenzCar());
    }

    virtual HighCar* createdSpecificHighCar(void)
    {
        return (new HighBenzCar());
    }
};

class BmwFactory : public Factory//寶馬車廠
{
public:
    virtual Car* createSpecificCar(void)
    {
        return (new BmwCar());
    }
    virtual HighCar* createdSpecificHighCar(void)
    {
        return (new HighBmwCar());
    }
};


int main(int argc, char** argv)
{
    Factory* factory = new BenzFactory();
    Car* specificCar = factory->createSpecificCar();
    HighCar* spcificHighCar = factory->createdSpecificHighCar();
    
    delete factory; delete specificCar; delete spcificHighCar;
    
    return 0;
}

輸出結果如下:

  以上代碼在VC6.0上運行OK。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM