工廠模式

解決的問(wèn)題:解決接口選擇的問(wèn)題
使用的場(chǎng)景:明確的計(jì)劃不同條件下創(chuàng)建不同的實(shí)例時(shí);一般應(yīng)用與多種同類型類的情況,將這些類隱藏起來(lái),再提供統(tǒng)一的接口,便于維護(hù)和修改;
解決的方法:讓子類實(shí)現(xiàn)工廠接口,返回的也是一個(gè)抽象的鏟平
關(guān)鍵的代碼:創(chuàng)建過(guò)程在子類中執(zhí)行

  • 優(yōu)點(diǎn):
    1、一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象時(shí),只需要知道其名稱就可以了;
    2、擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,值需要擴(kuò)展一個(gè)工廠類就可以;
    3、屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。
  • 缺點(diǎn):
    1、每增加一個(gè)產(chǎn)品,需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠,使得系統(tǒng)中個(gè)數(shù)成倍增加,一定程度上增加了系統(tǒng)的復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類的依賴;
    2、每添加一個(gè)產(chǎn)品子類,都必須在工廠類中添加一個(gè)判斷分支,這違背了開放-封閉原則。
工廠模式.PNG
  • 實(shí)例:
    舉個(gè)例子,現(xiàn)在有寶馬車和奔馳車兩種車需要生產(chǎn),但是只有一個(gè)工廠,且只能在同一時(shí)間生產(chǎn)一種車,這時(shí)就有工廠決定生產(chǎn)那種車了。例子雖然不是十分恰當(dāng),但是會(huì)其意即可。我們直接看UML類圖和代碼吧。
    案例.PNG
  • 代碼實(shí)現(xiàn)
#include <iostream>
using namespace std;

enum CarType
{
  BENZ,
  BMW
};
class Car //車類
{
public:
    virtual void createCar(void) = 0; //純虛函數(shù)

//純虛函數(shù)
/* 什么是純虛函數(shù)(pure virtual function):
 *1、當(dāng)想在積累中抽象出一個(gè)方法,且該基類只能被繼承,而不能被實(shí)例化
 *2、這個(gè)方法必須在派生類中實(shí)現(xiàn)
};
class BenzCar:public Car //奔馳
{
public:
    BenzCar()
    {
        cout<<"BenzCar---奔馳"<<endl;
    }
    virtual void createCar(void)
    {
         cout<<"BenzCar::createCar"<<endl;
    }
    
};
class BmwCar:public Car //寶馬
{
public:
    BmwCar()
    {
        cout<<"BmwCar---寶馬"<<endl;
    }
    virtual void createCar(void)
    {
         cout<<"BmwCar::createCar"<<endl;
    }
    
};

class CarFactory //車廠
{
public:
    Car *createSpecificCar(CarType type)
    {
        switch(type)
        {
        case BENZ: //生產(chǎn)奔馳
            return (new BenzCar());
            break;
        case BMW: //生產(chǎn)寶馬
            return (new BmwCar());
            break;
        default:
            return NULL;
            break;
        }
    }
};
int main()
{
    CarFactory carfac;
    Car* specificCarA = carfac.createSpecificCar(BENZ);
    Car* specificCarB = carfac.createSpecificCar(BMW);
    
    //delete specificCarA; delete specificCarB; 
    return 0;
    
}

=============================運(yùn)行結(jié)果==================================
BenzCar---奔馳
BmwCar---寶馬

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容