解決的問(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---寶馬